diff --git a/Jenkinsfile b/Jenkinsfile
index 583fcc7efd..ef26773534 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -44,6 +44,7 @@ def pre_test(){
git pull
git fetch
git checkout ${CHANGE_BRANCH}
+ git pull
git merge develop
cd ${WK}
git reset --hard
@@ -79,14 +80,25 @@ pipeline {
changeRequest()
}
parallel {
- stage('python') {
- agent{label 'pytest'}
+ stage('python_1') {
+ agent{label 'p1'}
steps {
pre_test()
sh '''
cd ${WKC}/tests
- ./test-all.sh pytestfq
+ ./test-all.sh p1
+ date'''
+ }
+ }
+ stage('python_2') {
+ agent{label 'p2'}
+ steps {
+
+ pre_test()
+ sh '''
+ cd ${WKC}/tests
+ ./test-all.sh p2
date'''
}
}
diff --git a/cmake/version.inc b/cmake/version.inc
index e11e782a78..7d0ad0585f 100644
--- a/cmake/version.inc
+++ b/cmake/version.inc
@@ -4,7 +4,7 @@ PROJECT(TDengine)
IF (DEFINED VERNUMBER)
SET(TD_VER_NUMBER ${VERNUMBER})
ELSE ()
- SET(TD_VER_NUMBER "2.0.11.0")
+ SET(TD_VER_NUMBER "2.0.12.0")
ENDIF ()
IF (DEFINED VERCOMPATIBLE)
diff --git a/documentation20/webdocs/markdowndocs/Documentation-ch.md b/documentation20/webdocs/markdowndocs/Documentation-ch.md
index 766a428f1b..20f9bcb730 100644
--- a/documentation20/webdocs/markdowndocs/Documentation-ch.md
+++ b/documentation20/webdocs/markdowndocs/Documentation-ch.md
@@ -128,5 +128,18 @@ TDengine是一个高效的存储、查询、分析时序大数据的平台,专
## [培训和FAQ](https://www.taosdata.com/cn/faq)
-- [FAQ](https://www.taosdata.com/cn/documentation20/faq):常见问题与答案
-- [应用案列](https://www.taosdata.com/cn/blog/?categories=4):一些使用实例来解释如何使用TDengine
+
+
diff --git a/documentation20/webdocs/markdowndocs/Getting Started-ch.md b/documentation20/webdocs/markdowndocs/Getting Started-ch.md
index 9f9d3a2ec2..b53c014ba6 100644
--- a/documentation20/webdocs/markdowndocs/Getting Started-ch.md
+++ b/documentation20/webdocs/markdowndocs/Getting Started-ch.md
@@ -20,7 +20,7 @@ TDengine的安装非常简单,从下载到安装成功仅仅只要几秒钟。
- TDengine-server-2.0.10.0-Linux-x64.deb (2.7M)
- TDengine-server-2.0.10.0-Linux-x64.tar.gz (4.5M)
-具体的安装过程,请参见TDengine多种安装包的安装和卸载。
+具体的安装过程,请参见TDengine多种安装包的安装和卸载以及视频教程。
## 轻松启动
diff --git a/documentation20/webdocs/markdowndocs/Model-ch.md b/documentation20/webdocs/markdowndocs/Model-ch.md
index 27105bdb90..dce7819423 100644
--- a/documentation20/webdocs/markdowndocs/Model-ch.md
+++ b/documentation20/webdocs/markdowndocs/Model-ch.md
@@ -59,3 +59,5 @@ INSERT INTO d1001 USING METERS TAGS ("Beijng.Chaoyang", 2) VALUES (now, 10.2, 21
TDengine支持多列模型,只要物理量是一个数据采集点同时采集的(时间戳一致),这些量就可以作为不同列放在一张超级表里。但还有一种极限的设计,单列模型,每个采集的物理量都单独建表,因此每种类型的物理量都单独建立一超级表。比如电流、电压、相位,就建三张超级表。
TDengine建议尽可能采用多列模型,因为插入效率以及存储效率更高。但对于有些场景,一个采集点的采集量的种类经常变化,这个时候,如果采用多列模型,就需要频繁修改超级表的结构定义,让应用变的复杂,这个时候,采用单列模型会显得简单。
+
+关于数据建模请参考视频教程。
diff --git a/documentation20/webdocs/markdowndocs/cluster-ch.md b/documentation20/webdocs/markdowndocs/cluster-ch.md
index 60ac6e4c2e..f1c275ab0c 100644
--- a/documentation20/webdocs/markdowndocs/cluster-ch.md
+++ b/documentation20/webdocs/markdowndocs/cluster-ch.md
@@ -226,3 +226,5 @@ SHOW MNODES;
如果副本数为偶数,当一个vnode group里一半vnode不工作时,是无法从中选出master的。同理,一半mnode不工作时,是无法选出mnode的master的,因为存在“split brain”问题。为解决这个问题,TDengine引入了arbitrator的概念。Arbitrator模拟一个vnode或mnode在工作,但只简单的负责网络连接,不处理任何数据插入或访问。只要包含arbitrator在内,超过半数的vnode或mnode工作,那么该vnode group或mnode组就可以正常的提供数据插入或查询服务。比如对于副本数为2的情形,如果一个节点A离线,但另外一个节点B正常,而且能连接到arbitrator, 那么节点B就能正常工作。
TDengine提供一个执行程序tarbitrator, 找任何一台Linux服务器运行它即可。请点击[安装包下载](https://www.taosdata.com/cn/all-downloads/),在TDengine Arbitrator Linux一节中,选择适合的版本下载并安装。该程序对系统资源几乎没有要求,只需要保证有网络连接即可。该应用的命令行参数`-p`可以指定其对外服务的端口号,缺省是6042。配置每个taosd实例时,可以在配置文件taos.cfg里将参数arbitrator设置为arbitrator的End Point。如果该参数配置了,当副本数为偶数数,系统将自动连接配置的arbitrator。如果副本数为奇数,即使配置了arbitrator, 系统也不会去建立连接。
+
+关于集群搭建请参考视频教程。
diff --git a/documentation20/webdocs/markdowndocs/connector-ch.md b/documentation20/webdocs/markdowndocs/connector-ch.md
index 821b4c23bf..cc6287953a 100644
--- a/documentation20/webdocs/markdowndocs/connector-ch.md
+++ b/documentation20/webdocs/markdowndocs/connector-ch.md
@@ -187,7 +187,7 @@ C/C++的API类似于MySQL的C API。应用程序使用时,需要包含TDengine
- pass:密码
- db:数据库名字,如果用户没有提供,也可以正常连接,用户可以通过该连接创建新的数据库,如果用户提供了数据库名字,则说明该数据库用户已经创建好,缺省使用该数据库
- port:端口号
-
+
返回值为空表示失败。应用程序需要保存返回的参数,以便后续API调用。
- `char *taos_get_server_info(TAOS *taos)`
@@ -336,7 +336,7 @@ TDengine的异步API均采用非阻塞调用模式。应用程序可以用多线
- `TAOS_RES* taos_stmt_use_result(TAOS_STMT *stmt)`
获取语句的结果集。结果集的使用方式与非参数化调用时一致,使用完成后,应对此结果集调用 `taos_free_result`以释放资源。
-
+
- `int taos_stmt_close(TAOS_STMT *stmt)`
执行完毕,释放所有资源。
@@ -354,7 +354,7 @@ TDengine提供时间驱动的实时流式计算API。可以每隔一指定的时
* stime:是流式计算开始的时间,如果是0,表示从现在开始,如果不为零,表示从指定的时间开始计算(UTC时间从1970/1/1算起的毫秒数)
* param:是应用提供的用于回调的一个参数,回调时,提供给应用
* callback: 第二个回调函数,会在连续查询自动停止时被调用。
-
+
返回值为NULL,表示创建成功,返回值不为空,表示成功。
- `void taos_close_stream (TAOS_STREAM *tstr)`
@@ -394,6 +394,8 @@ TDengine提供时间驱动的实时流式计算API。可以每隔一指定的时
## Python Connector
+Python连接器的使用参见视频教程
+
### 安装准备
* 应用驱动安装请参考安装连接器驱动步骤。
* 已安装python 2.7 or >= 3.4
@@ -433,7 +435,7 @@ python -m pip install python3\
* 导入TDengine客户端模块
```python
-import taos
+import taos
```
* 获取连接并获取游标对象
```python
@@ -445,7 +447,7 @@ c1 = conn.cursor()
* 写入数据
```python
import datetime
-
+
# 创建数据库
c1.execute('create database db')
c1.execute('use db')
@@ -473,7 +475,7 @@ numOfRows = c1.rowcount
numOfCols = len(c1.description)
for irow in range(numOfRows):
print("Row%d: ts=%s, temperature=%d, humidity=%f" %(irow, data[irow][0], data[irow][1],data[irow][2]))
-
+
# 直接使用cursor 循环拉取查询结果
c1.execute('select * from tb')
for data in c1:
@@ -534,7 +536,7 @@ conn.close()
## RESTful Connector
-为支持各种不同类型平台的开发,TDengine提供符合REST设计标准的API,即RESTful API。为最大程度降低学习成本,不同于其他数据库RESTful API的设计方法,TDengine直接通过HTTP POST 请求BODY中包含的SQL语句来操作数据库,仅需要一个URL。
+为支持各种不同类型平台的开发,TDengine提供符合REST设计标准的API,即RESTful API。为最大程度降低学习成本,不同于其他数据库RESTful API的设计方法,TDengine直接通过HTTP POST 请求BODY中包含的SQL语句来操作数据库,仅需要一个URL。RESTful连接器的使用参见视频教程。
### HTTP请求格式
@@ -779,7 +781,7 @@ https://www.taosdata.com/blog/2020/11/02/1901.html
TDengine提供了GO驱动程序`taosSql`。 `taosSql`实现了GO语言的内置接口`database/sql/driver`。用户只需按如下方式引入包就可以在应用程序中访问TDengine, 详见`https://github.com/taosdata/driver-go/blob/develop/taosSql/driver_test.go`。
-使用 Go 连接器的示例代码请参考 https://github.com/taosdata/TDengine/tree/develop/tests/examples/go。
+使用 Go 连接器的示例代码请参考 https://github.com/taosdata/TDengine/tree/develop/tests/examples/go 以及视频教程。
```Go
import (
@@ -796,7 +798,7 @@ go env -w GOPROXY=https://goproxy.io,direct
### 常用API
-- sql.Open(DRIVER_NAME string, dataSourceName string) *DB`
+- `sql.Open(DRIVER_NAME string, dataSourceName string) *DB`
该API用来打开DB,返回一个类型为*DB的对象,一般情况下,DRIVER_NAME设置为字符串`taosSql`, dataSourceName设置为字符串`user:password@/tcp(host:port)/dbname`,如果客户想要用多个goroutine并发访问TDengine, 那么需要在各个goroutine中分别创建一个sql.Open对象并用之访问TDengine
@@ -835,6 +837,8 @@ Node.js连接器支持的系统有:
| **OS类型** | Linux | Win64 | Win32 | Linux | Linux |
| **支持与否** | **支持** | **支持** | **支持** | **支持** | **支持** |
+Node.js连接器的使用参见视频教程
+
### 安装准备
* 应用驱动安装请参考安装连接器驱动步骤。
@@ -909,7 +913,7 @@ node nodejsChecker.js host=localhost
#### 建立连接
-使用node.js连接器时,必须先require ```td2.0-connector```,然后使用 ```taos.connect``` 函数。```taos.connect``` 函数必须提供的参数是```host```,其它参数在没有提供的情况下会使用如下的默认值。最后需要初始化```cursor``` 来和TDengine服务端通信
+使用node.js连接器时,必须先require `td2.0-connector`,然后使用 `taos.connect` 函数。`taos.connect` 函数必须提供的参数是`host`,其它参数在没有提供的情况下会使用如下的默认值。最后需要初始化`cursor` 来和TDengine服务端通信
```javascript
const taos = require('td2.0-connector');
@@ -945,13 +949,13 @@ TDengine目前还不支持update和delete语句。
#### 查询
-可通过 ```cursor.query``` 函数来查询数据库。
+可通过 `cursor.query` 函数来查询数据库。
```javascript
var query = cursor.query('show databases;')
```
-查询的结果可以通过 ```query.execute()``` 函数获取并打印出来
+查询的结果可以通过 `query.execute()` 函数获取并打印出来
```javascript
var promise = query.execute();
@@ -959,7 +963,7 @@ promise.then(function(result) {
result.pretty();
});
```
-格式化查询语句还可以使用```query```的```bind```方法。如下面的示例:```query```会自动将提供的数值填入查询语句的```?```里。
+格式化查询语句还可以使用`query`的`bind`方法。如下面的示例:`query`会自动将提供的数值填入查询语句的`?`里。
```javascript
var query = cursor.query('select * from meterinfo.meters where ts <= ? and areaid = ?;').bind(new Date(), 5);
@@ -967,7 +971,7 @@ query.execute().then(function(result) {
result.pretty();
})
```
-如果在```query```语句里提供第二个参数并设为```true```也可以立即获取查询结果。如下:
+如果在`query`语句里提供第二个参数并设为`true`也可以立即获取查询结果。如下:
```javascript
var promise = cursor.query('select * from meterinfo.meters where v1 = 30;', true)
@@ -991,4 +995,4 @@ promise2.then(function(result) {
### 示例
这里提供了一个使用NodeJS 连接器建表,插入天气数据并查询插入的数据的代码示例
-这里同样是一个使用NodeJS 连接器建表,插入天气数据并查询插入的数据的代码示例,但和上面不同的是,该示例只使用`cursor`.
\ No newline at end of file
+这里同样是一个使用NodeJS 连接器建表,插入天气数据并查询插入的数据的代码示例,但和上面不同的是,该示例只使用`cursor`.
diff --git a/documentation20/webdocs/markdowndocs/connector-java-ch.md b/documentation20/webdocs/markdowndocs/connector-java-ch.md
index fe029ba269..7ba573d2e4 100644
--- a/documentation20/webdocs/markdowndocs/connector-java-ch.md
+++ b/documentation20/webdocs/markdowndocs/connector-java-ch.md
@@ -6,6 +6,8 @@ Java连接器支持的系统有:
| **OS类型** | Linux | Win64 | Win32 | Linux | Linux |
| **支持与否** | **支持** | **支持** | **支持** | **支持** | **支持** |
+Java连接器的使用请参见视频教程。
+
TDengine 为了方便 Java 应用使用,提供了遵循 JDBC 标准(3.0)API 规范的 `taos-jdbcdriver` 实现。目前可以通过 [Sonatype Repository][1] 搜索并下载。
由于 TDengine 是使用 c 语言开发的,使用 taos-jdbcdriver 驱动包时需要依赖系统对应的本地函数库。
diff --git a/packaging/tools/post.sh b/packaging/tools/post.sh
index 6b4d183764..7a416c5576 100755
--- a/packaging/tools/post.sh
+++ b/packaging/tools/post.sh
@@ -265,8 +265,14 @@ function install_config() {
[ -f ${cfg_dir}/taos.cfg ] && ${csudo} cp ${cfg_dir}/taos.cfg ${cfg_install_dir}
${csudo} chmod 644 ${cfg_install_dir}/*
fi
+
+ # Save standard input to 6 and open / dev / TTY on standard input
+ exec 6<&0 0 /dev/null; then
csudo="sudo"
fi
-#ulimit -c unlimited
+if [[ ! -n ${corePath} ]]; then
+ echo -e -n "${GREEN}Please enter a file directory to save the coredump file${NC}:"
+ read corePath
+ while true; do
+ if [[ ! -z "$corePath" ]]; then
+ break
+ else
+ read -p "Please enter a file directory to save the coredump file:" corePath
+ fi
+ done
+fi
+
+ulimit -c unlimited
${csudo} sed -i '/ulimit -c unlimited/d' /etc/profile ||:
${csudo} sed -i '$a\ulimit -c unlimited' /etc/profile ||:
source /etc/profile
-${csudo} mkdir -p /coredump ||:
-${csudo} sysctl -w kernel.core_pattern='/coredump/core-%e-%p' ||:
-${csudo} echo '/coredump/core-%e-%p' | ${csudo} tee /proc/sys/kernel/core_pattern ||:
+${csudo} mkdir -p ${corePath} ||:
+${csudo} sysctl -w kernel.core_pattern=${corePath}/core-%e-%p ||:
+${csudo} echo "${corePath}/core-%e-%p" | ${csudo} tee /proc/sys/kernel/core_pattern ||:
diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml
index 0b9c33950c..d1a334664e 100644
--- a/snap/snapcraft.yaml
+++ b/snap/snapcraft.yaml
@@ -1,6 +1,6 @@
name: tdengine
base: core18
-version: '2.0.11.0'
+version: '2.0.12.0'
icon: snap/gui/t-dengine.svg
summary: an open-source big data platform designed and optimized for IoT.
description: |
@@ -72,7 +72,7 @@ parts:
- usr/bin/taosd
- usr/bin/taos
- usr/bin/taosdemo
- - usr/lib/libtaos.so.2.0.11.0
+ - usr/lib/libtaos.so.2.0.12.0
- usr/lib/libtaos.so.1
- usr/lib/libtaos.so
diff --git a/src/balance/src/bnMain.c b/src/balance/src/bnMain.c
index 2532cf09a7..11576c1135 100644
--- a/src/balance/src/bnMain.c
+++ b/src/balance/src/bnMain.c
@@ -66,6 +66,77 @@ static bool bnCheckFree(SDnodeObj *pDnode) {
return true;
}
+static void bnSwapVnodeGid(SVnodeGid *pVnodeGid1, SVnodeGid *pVnodeGid2) {
+ SVnodeGid tmp = *pVnodeGid1;
+ *pVnodeGid1 = *pVnodeGid2;
+ *pVnodeGid2 = tmp;
+}
+
+static void bnAdjustVnodeIndex(SVgObj *pInVg) {
+ int32_t d0Id = pInVg->vnodeGid[0].dnodeId;
+ int32_t d1Id = pInVg->vnodeGid[1].dnodeId;
+ int32_t d2Id = pInVg->vnodeGid[2].dnodeId;
+
+ int32_t vgId = pInVg->vgId;
+ int32_t d0Num = 0;
+ int32_t d1Num = 0;
+ int32_t d2Num = 0;
+
+ void *pIter = NULL;
+ while (1) {
+ SVgObj *pVgroup = NULL;
+ pIter = mnodeGetNextVgroup(pIter, &pVgroup);
+ if (pVgroup == NULL) break;
+
+ if (pVgroup->vgId != vgId) {
+ if (pVgroup->vnodeGid[0].dnodeId == d0Id) d0Num++;
+ if (pVgroup->vnodeGid[0].dnodeId == d1Id) d1Num++;
+ if (pVgroup->vnodeGid[0].dnodeId == d2Id) d2Num++;
+ }
+
+ mnodeDecVgroupRef(pVgroup);
+ }
+
+ if (pInVg->numOfVnodes == 1) {
+ }
+
+ if (pInVg->numOfVnodes == 2) {
+ mDebug("vgId:%d, dnode:%d num:%d dnode:%d num:%d", pInVg->vgId, d0Id, d0Num, d1Id, d1Num);
+ if (d0Num > d1Num) {
+ mDebug("vgId:%d, adjust vnode index 0 to 1", pInVg->vgId);
+ bnSwapVnodeGid(&pInVg->vnodeGid[0], &pInVg->vnodeGid[1]);
+ }
+ }
+
+ if (pInVg->numOfVnodes >= 3) {
+ mDebug("vgId:%d, dnode:%d num:%d dnode:%d num:%d dnode:%d num:%d", pInVg->vgId, d0Id, d0Num, d1Id, d1Num, d2Id, d2Num);
+ if (d0Num <= d1Num && d0Num <= d2Num) {
+ if (d1Num > d2Num) {
+ mDebug("vgId:%d, adjust vnode index 1 to 2", pInVg->vgId);
+ bnSwapVnodeGid(&pInVg->vnodeGid[1], &pInVg->vnodeGid[2]);
+ }
+ } else if (d1Num <= d2Num && d1Num <= d0Num) {
+ mDebug("vgId:%d, adjust vnode index 0 to 1", pInVg->vgId);
+ bnSwapVnodeGid(&pInVg->vnodeGid[0], &pInVg->vnodeGid[1]);
+ if (d0Num > d2Num) {
+ mDebug("vgId:%d, adjust vnode index 1 to 2", pInVg->vgId);
+ bnSwapVnodeGid(&pInVg->vnodeGid[1], &pInVg->vnodeGid[2]);
+ }
+ } else {
+ mDebug("vgId:%d, adjust vnode index 0 to 2", pInVg->vgId);
+ bnSwapVnodeGid(&pInVg->vnodeGid[0], &pInVg->vnodeGid[2]);
+ if (d1Num > d0Num) {
+ mDebug("vgId:%d, adjust vnode index 1 to 2", pInVg->vgId);
+ bnSwapVnodeGid(&pInVg->vnodeGid[1], &pInVg->vnodeGid[2]);
+ }
+ }
+ }
+
+ for (int i = 0; i < pInVg->numOfVnodes; ++i) {
+ mDebug("vgId:%d index:%d dnodeId:%d", pInVg->vgId, i, pInVg->vnodeGid[i].dnodeId);
+ }
+}
+
static void bnDiscardVnode(SVgObj *pVgroup, SVnodeGid *pVnodeGid) {
mDebug("vgId:%d, dnode:%d is dropping", pVgroup->vgId, pVnodeGid->dnodeId);
@@ -88,15 +159,10 @@ static void bnDiscardVnode(SVgObj *pVgroup, SVnodeGid *pVnodeGid) {
memcpy(pVgroup->vnodeGid, vnodeGid, TSDB_MAX_REPLICA * sizeof(SVnodeGid));
pVgroup->numOfVnodes = numOfVnodes;
+ bnAdjustVnodeIndex(pVgroup);
mnodeUpdateVgroup(pVgroup);
}
-static void bnSwapVnodeGid(SVnodeGid *pVnodeGid1, SVnodeGid *pVnodeGid2) {
- SVnodeGid tmp = *pVnodeGid1;
- *pVnodeGid1 = *pVnodeGid2;
- *pVnodeGid2 = tmp;
-}
-
int32_t bnAllocVnodes(SVgObj *pVgroup) {
int32_t dnode = 0;
int32_t vnodes = 0;
@@ -147,6 +213,7 @@ int32_t bnAllocVnodes(SVgObj *pVgroup) {
}
}
+ bnAdjustVnodeIndex(pVgroup);
bnReleaseDnodes();
bnUnLock();
return TSDB_CODE_SUCCESS;
@@ -233,6 +300,7 @@ static int32_t bnAddVnode(SVgObj *pVgroup, SDnodeObj *pSrcDnode, SDnodeObj *pDes
vnodeGids[numOfVnodes].pDnode = pDestDnode;
numOfVnodes++;
+ // move the src vnode to the end
for (int32_t v = 0; v < numOfVnodes; ++v) {
if (pSrcDnode != NULL && pSrcDnode->dnodeId == vnodeGids[v].dnodeId) {
bnSwapVnodeGid(&vnodeGids[v], &vnodeGids[numOfVnodes - 1]);
@@ -241,6 +309,11 @@ static int32_t bnAddVnode(SVgObj *pVgroup, SDnodeObj *pSrcDnode, SDnodeObj *pDes
}
}
+ // adjust the vgroup postion
+ if (pSrcDnode == NULL) {
+ bnAdjustVnodeIndex(pVgroup);
+ }
+
memcpy(&pVgroup->vnodeGid, &vnodeGids, sizeof(SVnodeGid) * TSDB_MAX_REPLICA);
pVgroup->numOfVnodes = numOfVnodes;
atomic_add_fetch_32(&pDestDnode->openVnodes, 1);
@@ -330,7 +403,7 @@ void bnReset() {
tsAccessSquence = 0;
}
-static int32_t bnMonitorVgroups() {
+static bool bnMonitorVgroups() {
void * pIter = NULL;
SVgObj *pVgroup = NULL;
bool hasUpdatingVgroup = false;
@@ -489,6 +562,7 @@ void bnCheckStatus() {
mInfo("dnode:%d, set to offline state, access seq:%d last seq:%d laststat:%d", pDnode->dnodeId, tsAccessSquence,
pDnode->lastAccess, pDnode->status);
bnSetVgroupOffline(pDnode);
+ bnStartTimer(3000);
}
}
mnodeDecDnodeRef(pDnode);
diff --git a/src/balance/src/bnThread.c b/src/balance/src/bnThread.c
index bf046a9fae..84f8694fca 100644
--- a/src/balance/src/bnThread.c
+++ b/src/balance/src/bnThread.c
@@ -31,7 +31,10 @@ static void *bnThreadFunc(void *arg) {
}
pthread_cond_wait(&tsBnThread.cond, &tsBnThread.mutex);
+ mDebug("balance thread wakes up to work");
bool updateSoon = bnStart();
+ mDebug("balance thread finished this poll, updateSoon:%d", updateSoon);
+
bnStartTimer(updateSoon ? 1000 : -1);
pthread_mutex_unlock(&(tsBnThread.mutex));
}
@@ -101,8 +104,8 @@ static void bnProcessTimer(void *handle, void *tmrId) {
tsBnThread.timer = NULL;
tsAccessSquence++;
- bnCheckStatus();
bnStartTimer(-1);
+ bnCheckStatus();
if (handle == NULL) {
if (tsAccessSquence % tsBalanceInterval == 0) {
@@ -121,6 +124,7 @@ void bnStartTimer(int64_t mseconds) {
bool updateSoon = (mseconds != -1);
if (updateSoon) {
+ mTrace("balance function will be called after %" PRId64 " ms", mseconds);
taosTmrReset(bnProcessTimer, mseconds, (void *)mseconds, tsMnodeTmr, &tsBnThread.timer);
} else {
taosTmrReset(bnProcessTimer, tsStatusInterval * 1000, NULL, tsMnodeTmr, &tsBnThread.timer);
diff --git a/src/client/inc/tscLocalMerge.h b/src/client/inc/tscLocalMerge.h
index 43ba31f331..0617645188 100644
--- a/src/client/inc/tscLocalMerge.h
+++ b/src/client/inc/tscLocalMerge.h
@@ -38,12 +38,6 @@ typedef struct SLocalDataSource {
tFilePage filePage;
} SLocalDataSource;
-enum {
- TSC_LOCALREDUCE_READY = 0x0,
- TSC_LOCALREDUCE_IN_PROGRESS = 0x1,
- TSC_LOCALREDUCE_TOBE_FREED = 0x2,
-};
-
typedef struct SLocalReducer {
SLocalDataSource ** pLocalDataSrc;
int32_t numOfBuffer;
@@ -56,7 +50,6 @@ typedef struct SLocalReducer {
tFilePage * pTempBuffer;
struct SQLFunctionCtx *pCtx;
int32_t rowSize; // size of each intermediate result.
- int32_t status; // denote it is in reduce process, in reduce process, it
bool hasPrevRow; // cannot be released
bool hasUnprocessedRow;
tOrderDescriptor * pDesc;
diff --git a/src/client/inc/tscLog.h b/src/client/inc/tscLog.h
index 5bbf05aa5f..5273a87ea0 100644
--- a/src/client/inc/tscLog.h
+++ b/src/client/inc/tscLog.h
@@ -22,8 +22,8 @@ extern "C" {
#include "tlog.h"
-extern uint32_t cDebugFlag;
-extern uint32_t tscEmbedded;
+extern int32_t cDebugFlag;
+extern int8_t tscEmbedded;
#define tscFatal(...) do { if (cDebugFlag & DEBUG_FATAL) { taosPrintLog("TSC FATAL ", tscEmbedded ? 255 : cDebugFlag, __VA_ARGS__); }} while(0)
#define tscError(...) do { if (cDebugFlag & DEBUG_ERROR) { taosPrintLog("TSC ERROR ", tscEmbedded ? 255 : cDebugFlag, __VA_ARGS__); }} while(0)
diff --git a/src/client/inc/tsclient.h b/src/client/inc/tsclient.h
index 33ea06ba9c..6879470145 100644
--- a/src/client/inc/tsclient.h
+++ b/src/client/inc/tsclient.h
@@ -69,9 +69,10 @@ typedef struct STableMeta {
int16_t sversion;
int16_t tversion;
char sTableId[TSDB_TABLE_FNAME_LEN];
- SVgroupInfo vgroupInfo;
+ int32_t vgId;
SCorVgroupInfo corVgroupInfo;
STableId id;
+// union {int64_t stableUid; SSchema* schema;};
SSchema schema[]; // if the table is TSDB_CHILD_TABLE, schema is acquired by super table meta info
} STableMeta;
@@ -307,6 +308,7 @@ typedef struct STscObj {
SRpcCorEpSet *tscCorMgmtEpSet;
void* pDnodeConn;
pthread_mutex_t mutex;
+ int32_t numOfObj; // number of sqlObj from this tscObj
} STscObj;
typedef struct SSubqueryState {
@@ -419,7 +421,7 @@ void tscCloseTscObj(void *pObj);
// todo move to taos? or create a new file: taos_internal.h
TAOS *taos_connect_a(char *ip, char *user, char *pass, char *db, uint16_t port, void (*fp)(void *, TAOS_RES *, int),
void *param, TAOS **taos);
-TAOS_RES* taos_query_h(TAOS* taos, const char *sqlstr, TAOS_RES** res);
+TAOS_RES* taos_query_h(TAOS* taos, const char *sqlstr, int64_t* res);
void waitForQueryRsp(void *param, TAOS_RES *tres, int code);
void doAsyncQuery(STscObj *pObj, SSqlObj *pSql, __async_cb_func_t fp, void *param, const char *sqlstr, size_t sqlLen);
@@ -477,14 +479,14 @@ static FORCE_INLINE void tscGetResultColumnChr(SSqlRes* pRes, SFieldInfo* pField
}
}
-extern SCacheObj* tscMetaCache;
-extern int tscObjRef;
-extern void * tscTmr;
-extern void * tscQhandle;
-extern int tscKeepConn[];
-extern int tscNumOfThreads;
-extern int tscRefId;
-
+extern SCacheObj *tscMetaCache;
+
+extern int tscObjRef;
+extern void *tscTmr;
+extern void *tscQhandle;
+extern int tscKeepConn[];
+extern int tscRefId;
+extern int tscNumOfObj; // number of existed sqlObj in current process.
extern int (*tscBuildMsg[TSDB_SQL_MAX])(SSqlObj *pSql, SSqlInfo *pInfo);
diff --git a/src/client/src/tscAsync.c b/src/client/src/tscAsync.c
index 97b962e53a..ad7041db10 100644
--- a/src/client/src/tscAsync.c
+++ b/src/client/src/tscAsync.c
@@ -388,10 +388,10 @@ void tscQueueAsyncRes(SSqlObj *pSql) {
return;
}
+ assert(pSql->res.code != TSDB_CODE_SUCCESS);
tscError("%p add into queued async res, code:%s", pSql, tstrerror(pSql->res.code));
SSqlRes *pRes = &pSql->res;
-
if (pSql->fp == NULL || pSql->fetchFp == NULL){
return;
}
diff --git a/src/client/src/tscFunctionImpl.c b/src/client/src/tscFunctionImpl.c
index f313d355f1..22240efe14 100644
--- a/src/client/src/tscFunctionImpl.c
+++ b/src/client/src/tscFunctionImpl.c
@@ -2597,14 +2597,23 @@ static void percentile_next_step(SQLFunctionCtx *pCtx) {
}
//////////////////////////////////////////////////////////////////////////////////
+static void buildHistogramInfo(SAPercentileInfo* pInfo) {
+ pInfo->pHisto = (SHistogramInfo*) ((char*) pInfo + sizeof(SAPercentileInfo));
+ pInfo->pHisto->elems = (SHistBin*) ((char*)pInfo->pHisto + sizeof(SHistogramInfo));
+}
+
static SAPercentileInfo *getAPerctInfo(SQLFunctionCtx *pCtx) {
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
-
+ SAPercentileInfo* pInfo = NULL;
+
if (pCtx->stableQuery && pCtx->currentStage != SECONDARY_STAGE_MERGE) {
- return (SAPercentileInfo*) pCtx->aOutputBuf;
+ pInfo = (SAPercentileInfo*) pCtx->aOutputBuf;
} else {
- return GET_ROWCELL_INTERBUF(pResInfo);
+ pInfo = GET_ROWCELL_INTERBUF(pResInfo);
}
+
+ buildHistogramInfo(pInfo);
+ return pInfo;
}
static bool apercentile_function_setup(SQLFunctionCtx *pCtx) {
@@ -2624,6 +2633,8 @@ static void apercentile_function(SQLFunctionCtx *pCtx) {
SResultRowCellInfo * pResInfo = GET_RES_INFO(pCtx);
SAPercentileInfo *pInfo = getAPerctInfo(pCtx);
+
+ assert(pInfo->pHisto->elems != NULL);
for (int32_t i = 0; i < pCtx->size; ++i) {
char *data = GET_INPUT_CHAR_INDEX(pCtx, i);
diff --git a/src/client/src/tscLocalMerge.c b/src/client/src/tscLocalMerge.c
index da763b9b0c..6f9bc6debc 100644
--- a/src/client/src/tscLocalMerge.c
+++ b/src/client/src/tscLocalMerge.c
@@ -93,7 +93,7 @@ static void tscInitSqlContext(SSqlCmd *pCmd, SLocalReducer *pReducer, tOrderDesc
// for top/bottom function, the output of timestamp is the first column
int32_t functionId = pExpr->functionId;
- if (functionId == TSDB_FUNC_TOP || functionId == TSDB_FUNC_BOTTOM) {
+ if (functionId == TSDB_FUNC_TOP || functionId == TSDB_FUNC_BOTTOM || functionId == TSDB_FUNC_DIFF) {
pCtx->ptsOutputBuf = pReducer->pCtx[0].aOutputBuf;
pCtx->param[2].i64Key = pQueryInfo->order.order;
pCtx->param[2].nType = TSDB_DATA_TYPE_BIGINT;
@@ -493,13 +493,6 @@ void tscDestroyLocalReducer(SSqlObj *pSql) {
// there is no more result, so we release all allocated resource
SLocalReducer *pLocalReducer = (SLocalReducer *)atomic_exchange_ptr(&pRes->pLocalReducer, NULL);
if (pLocalReducer != NULL) {
- int32_t status = 0;
- while ((status = atomic_val_compare_exchange_32(&pLocalReducer->status, TSC_LOCALREDUCE_READY,
- TSC_LOCALREDUCE_TOBE_FREED)) == TSC_LOCALREDUCE_IN_PROGRESS) {
- taosMsleep(100);
- tscDebug("%p waiting for delete procedure, status: %d", pSql, status);
- }
-
pLocalReducer->pFillInfo = taosDestroyFillInfo(pLocalReducer->pFillInfo);
if (pLocalReducer->pCtx != NULL) {
@@ -1303,6 +1296,10 @@ void resetOutputBuf(SQueryInfo *pQueryInfo, SLocalReducer *pLocalReducer) {// re
for (int32_t i = 0; i < t; ++i) {
SSqlExpr* pExpr = tscSqlExprGet(pQueryInfo, i);
pLocalReducer->pCtx[i].aOutputBuf = pLocalReducer->pResultBuf->data + pExpr->offset * pLocalReducer->resColModel->capacity;
+
+ if (pExpr->functionId == TSDB_FUNC_TOP || pExpr->functionId == TSDB_FUNC_BOTTOM || pExpr->functionId == TSDB_FUNC_DIFF) {
+ pLocalReducer->pCtx[i].ptsOutputBuf = pLocalReducer->pCtx[0].aOutputBuf;
+ }
}
memset(pLocalReducer->pResultBuf, 0, pLocalReducer->nResultBufSize + sizeof(tFilePage));
@@ -1437,24 +1434,13 @@ int32_t tscDoLocalMerge(SSqlObj *pSql) {
SLocalReducer *pLocalReducer = pRes->pLocalReducer;
SQueryInfo *pQueryInfo = tscGetQueryInfoDetail(pCmd, pCmd->clauseIndex);
-
- // set the data merge in progress
- int32_t prevStatus =
- atomic_val_compare_exchange_32(&pLocalReducer->status, TSC_LOCALREDUCE_READY, TSC_LOCALREDUCE_IN_PROGRESS);
- if (prevStatus != TSC_LOCALREDUCE_READY) {
- assert(prevStatus == TSC_LOCALREDUCE_TOBE_FREED); // it is in tscDestroyLocalReducer function already
- return TSDB_CODE_SUCCESS;
- }
-
- tFilePage *tmpBuffer = pLocalReducer->pTempBuffer;
+ tFilePage *tmpBuffer = pLocalReducer->pTempBuffer;
if (doHandleLastRemainData(pSql)) {
- pLocalReducer->status = TSC_LOCALREDUCE_READY; // set the flag, taos_free_result can release this result.
return TSDB_CODE_SUCCESS;
}
if (doBuildFilledResultForGroup(pSql)) {
- pLocalReducer->status = TSC_LOCALREDUCE_READY; // set the flag, taos_free_result can release this result.
return TSDB_CODE_SUCCESS;
}
@@ -1510,7 +1496,6 @@ int32_t tscDoLocalMerge(SSqlObj *pSql) {
pLocalReducer->discardData->num = 0;
if (saveGroupResultInfo(pSql)) {
- pLocalReducer->status = TSC_LOCALREDUCE_READY;
return TSDB_CODE_SUCCESS;
}
@@ -1556,7 +1541,6 @@ int32_t tscDoLocalMerge(SSqlObj *pSql) {
// here we do not check the return value
adjustLoserTreeFromNewData(pLocalReducer, pOneDataSrc, pTree);
- assert(pLocalReducer->status == TSC_LOCALREDUCE_IN_PROGRESS);
if (pRes->numOfRows == 0) {
handleUnprocessedRow(pCmd, pLocalReducer, tmpBuffer);
@@ -1567,7 +1551,6 @@ int32_t tscDoLocalMerge(SSqlObj *pSql) {
* If previous group is not skipped, keep it in pRes->numOfGroups
*/
if (notSkipped && saveGroupResultInfo(pSql)) {
- pLocalReducer->status = TSC_LOCALREDUCE_READY;
return TSDB_CODE_SUCCESS;
}
@@ -1587,7 +1570,6 @@ int32_t tscDoLocalMerge(SSqlObj *pSql) {
if (pRes->numOfRows == 0) {
continue;
} else {
- pLocalReducer->status = TSC_LOCALREDUCE_READY; // set the flag, taos_free_result can release this result.
return TSDB_CODE_SUCCESS;
}
} else { // result buffer is not full
@@ -1612,9 +1594,6 @@ int32_t tscDoLocalMerge(SSqlObj *pSql) {
genFinalResults(pSql, pLocalReducer, true);
}
- assert(pLocalReducer->status == TSC_LOCALREDUCE_IN_PROGRESS && pRes->row == 0);
- pLocalReducer->status = TSC_LOCALREDUCE_READY; // set the flag, taos_free_result can release this result.
-
return TSDB_CODE_SUCCESS;
}
diff --git a/src/client/src/tscParseInsert.c b/src/client/src/tscParseInsert.c
index ded12f64ea..a2dcb5d89a 100644
--- a/src/client/src/tscParseInsert.c
+++ b/src/client/src/tscParseInsert.c
@@ -731,7 +731,7 @@ static int32_t doParseInsertStatement(SSqlCmd* pCmd, char **str, SParsedDataColI
return code;
}
- dataBuf->vgId = pTableMeta->vgroupInfo.vgId;
+ dataBuf->vgId = pTableMeta->vgId;
dataBuf->numOfTables = 1;
*totalNum += numOfRows;
@@ -1413,13 +1413,25 @@ static void parseFileSendDataBlock(void *param, TAOS_RES *tres, int code) {
if (taos_errno(pSql) != TSDB_CODE_SUCCESS) { // handle error
assert(taos_errno(pSql) == code);
- taos_free_result(pSql);
- tfree(pSupporter);
- fclose(fp);
+ do {
+ if (code == TSDB_CODE_TDB_TABLE_RECONFIGURE) {
+ assert(pSql->res.numOfRows == 0);
+ int32_t errc = fseek(fp, 0, SEEK_SET);
+ if (errc < 0) {
+ tscError("%p failed to seek SEEK_SET since:%s", pSql, tstrerror(errno));
+ } else {
+ break;
+ }
+ }
- pParentSql->res.code = code;
- tscQueueAsyncRes(pParentSql);
- return;
+ taos_free_result(pSql);
+ tfree(pSupporter);
+ fclose(fp);
+
+ pParentSql->res.code = code;
+ tscQueueAsyncRes(pParentSql);
+ return;
+ } while (0);
}
// accumulate the total submit records
diff --git a/src/client/src/tscSQLParser.c b/src/client/src/tscSQLParser.c
index f1acea71c5..9151f98ee3 100644
--- a/src/client/src/tscSQLParser.c
+++ b/src/client/src/tscSQLParser.c
@@ -666,6 +666,7 @@ int32_t parseIntervalClause(SSqlObj* pSql, SQueryInfo* pQueryInfo, SQuerySQL* pQ
const char* msg1 = "invalid query expression";
const char* msg2 = "interval cannot be less than 10 ms";
const char* msg3 = "sliding cannot be used without interval";
+ const char* msg4 = "top/bottom query does not support order by value in interval query";
SSqlCmd* pCmd = &pSql->cmd;
@@ -712,6 +713,11 @@ int32_t parseIntervalClause(SSqlObj* pSql, SQueryInfo* pQueryInfo, SQuerySQL* pQ
return TSDB_CODE_TSC_INVALID_SQL;
}
+ int32_t colId = pQueryInfo->order.orderColId;
+ if (pQueryInfo->interval.interval > 0 && colId != PRIMARYKEY_TIMESTAMP_COL_INDEX) {
+ return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg4);
+ }
+
return TSDB_CODE_SUCCESS;
}
@@ -4646,7 +4652,7 @@ int32_t parseOrderbyClause(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SQuerySQL* pQu
if (!(orderByTags || orderByTS) && !isTopBottomQuery(pQueryInfo)) {
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg3);
- } else {
+ } else { // order by top/bottom result value column is not supported in case of interval query.
assert(!(orderByTags && orderByTS));
}
@@ -4936,7 +4942,7 @@ int32_t setAlterTableInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) {
}
SUpdateTableTagValMsg* pUpdateMsg = (SUpdateTableTagValMsg*) pCmd->payload;
- pUpdateMsg->head.vgId = htonl(pTableMeta->vgroupInfo.vgId);
+ pUpdateMsg->head.vgId = htonl(pTableMeta->vgId);
pUpdateMsg->tid = htonl(pTableMeta->id.tid);
pUpdateMsg->uid = htobe64(pTableMeta->id.uid);
pUpdateMsg->colId = htons(pTagsSchema->colId);
@@ -5442,6 +5448,7 @@ static void setCreateDBOption(SCreateDbMsg* pMsg, SCreateDBInfo* pCreateDb) {
pMsg->quorum = pCreateDb->quorum;
pMsg->ignoreExist = pCreateDb->ignoreExists;
pMsg->update = pCreateDb->update;
+ pMsg->cacheLastRow = pCreateDb->cachelast;
}
int32_t parseCreateDBOptions(SSqlCmd* pCmd, SCreateDBInfo* pCreateDbSql) {
diff --git a/src/client/src/tscSchemaUtil.c b/src/client/src/tscSchemaUtil.c
index fcc93ffadc..d77bb9990c 100644
--- a/src/client/src/tscSchemaUtil.c
+++ b/src/client/src/tscSchemaUtil.c
@@ -130,13 +130,14 @@ SSchema* tscGetColumnSchemaById(STableMeta* pTableMeta, int16_t colId) {
return NULL;
}
-static void tscInitCorVgroupInfo(SCorVgroupInfo *corVgroupInfo, SVgroupInfo *vgroupInfo) {
+static void tscInitCorVgroupInfo(SCorVgroupInfo *corVgroupInfo, SVgroupMsg *pVgroupMsg) {
corVgroupInfo->version = 0;
- corVgroupInfo->inUse = 0;
- corVgroupInfo->numOfEps = vgroupInfo->numOfEps;
- for (int32_t i = 0; i < corVgroupInfo->numOfEps; i++) {
- corVgroupInfo->epAddr[i].fqdn = strdup(vgroupInfo->epAddr[i].fqdn);
- corVgroupInfo->epAddr[i].port = vgroupInfo->epAddr[i].port;
+ corVgroupInfo->inUse = 0;
+ corVgroupInfo->numOfEps = pVgroupMsg->numOfEps;
+
+ for (int32_t i = 0; i < pVgroupMsg->numOfEps; i++) {
+ corVgroupInfo->epAddr[i].fqdn = strndup(pVgroupMsg->epAddr[i].fqdn, tListLen(pVgroupMsg->epAddr[0].fqdn));
+ corVgroupInfo->epAddr[i].port = pVgroupMsg->epAddr[i].port;
}
}
@@ -145,8 +146,10 @@ STableMeta* tscCreateTableMetaFromMsg(STableMetaMsg* pTableMetaMsg, size_t* size
int32_t schemaSize = (pTableMetaMsg->numOfColumns + pTableMetaMsg->numOfTags) * sizeof(SSchema);
STableMeta* pTableMeta = calloc(1, sizeof(STableMeta) + schemaSize);
+
pTableMeta->tableType = pTableMetaMsg->tableType;
-
+ pTableMeta->vgId = pTableMetaMsg->vgroup.vgId;
+
pTableMeta->tableInfo = (STableComInfo) {
.numOfTags = pTableMetaMsg->numOfTags,
.precision = pTableMetaMsg->precision,
@@ -156,18 +159,7 @@ STableMeta* tscCreateTableMetaFromMsg(STableMetaMsg* pTableMetaMsg, size_t* size
pTableMeta->id.tid = pTableMetaMsg->tid;
pTableMeta->id.uid = pTableMetaMsg->uid;
- SVgroupInfo* pVgroupInfo = &pTableMeta->vgroupInfo;
- pVgroupInfo->numOfEps = pTableMetaMsg->vgroup.numOfEps;
- pVgroupInfo->vgId = pTableMetaMsg->vgroup.vgId;
-
- for(int32_t i = 0; i < pVgroupInfo->numOfEps; ++i) {
- SEpAddrMsg* pEpMsg = &pTableMetaMsg->vgroup.epAddr[i];
-
- pVgroupInfo->epAddr[i].fqdn = strndup(pEpMsg->fqdn, tListLen(pEpMsg->fqdn));
- pVgroupInfo->epAddr[i].port = pEpMsg->port;
- }
-
- tscInitCorVgroupInfo(&pTableMeta->corVgroupInfo, pVgroupInfo);
+ tscInitCorVgroupInfo(&pTableMeta->corVgroupInfo, &pTableMetaMsg->vgroup);
pTableMeta->sversion = pTableMetaMsg->sversion;
pTableMeta->tversion = pTableMetaMsg->tversion;
diff --git a/src/client/src/tscServer.c b/src/client/src/tscServer.c
index ded04388f4..f7a2236262 100644
--- a/src/client/src/tscServer.c
+++ b/src/client/src/tscServer.c
@@ -45,32 +45,30 @@ static int32_t getWaitingTimeInterval(int32_t count) {
return 0;
}
- return initial * (2<<(count - 2));
+ return initial * ((2u)<<(count - 2));
}
-static void tscSetDnodeEpSet(SSqlObj* pSql, SVgroupInfo* pVgroupInfo) {
- assert(pSql != NULL && pVgroupInfo != NULL && pVgroupInfo->numOfEps > 0);
-
- SRpcEpSet* pEpSet = &pSql->epSet;
+static void tscSetDnodeEpSet(SRpcEpSet* pEpSet, SVgroupInfo* pVgroupInfo) {
+ assert(pEpSet != NULL && pVgroupInfo != NULL && pVgroupInfo->numOfEps > 0);
// Issue the query to one of the vnode among a vgroup randomly.
// change the inUse property would not affect the isUse attribute of STableMeta
pEpSet->inUse = rand() % pVgroupInfo->numOfEps;
// apply the FQDN string length check here
- bool hasFqdn = false;
+ bool existed = false;
pEpSet->numOfEps = pVgroupInfo->numOfEps;
for(int32_t i = 0; i < pVgroupInfo->numOfEps; ++i) {
- tstrncpy(pEpSet->fqdn[i], pVgroupInfo->epAddr[i].fqdn, tListLen(pEpSet->fqdn[i]));
pEpSet->port[i] = pVgroupInfo->epAddr[i].port;
- if (!hasFqdn) {
- hasFqdn = (strlen(pEpSet->fqdn[i]) > 0);
+ int32_t len = (int32_t) strnlen(pVgroupInfo->epAddr[i].fqdn, TSDB_FQDN_LEN);
+ if (len > 0) {
+ tstrncpy(pEpSet->fqdn[i], pVgroupInfo->epAddr[i].fqdn, tListLen(pEpSet->fqdn[i]));
+ existed = true;
}
}
-
- assert(hasFqdn);
+ assert(existed);
}
static void tscDumpMgmtEpSet(SSqlObj *pSql) {
@@ -102,7 +100,8 @@ void tscUpdateMgmtEpSet(SSqlObj *pSql, SRpcEpSet *pEpSet) {
pCorEpSet->epSet = *pEpSet;
taosCorEndWrite(&pCorEpSet->version);
}
-static void tscDumpEpSetFromVgroupInfo(SCorVgroupInfo *pVgroupInfo, SRpcEpSet *pEpSet) {
+
+static void tscDumpEpSetFromVgroupInfo(SRpcEpSet *pEpSet, SCorVgroupInfo *pVgroupInfo) {
if (pVgroupInfo == NULL) { return;}
taosCorBeginRead(&pVgroupInfo->version);
int8_t inUse = pVgroupInfo->inUse;
@@ -515,8 +514,8 @@ int tscBuildFetchMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
}
} else {
STableMeta* pTableMeta = pTableMetaInfo->pTableMeta;
- pRetrieveMsg->header.vgId = htonl(pTableMeta->vgroupInfo.vgId);
- tscDebug("%p build fetch msg from only one vgroup, vgId:%d", pSql, pTableMeta->vgroupInfo.vgId);
+ pRetrieveMsg->header.vgId = htonl(pTableMeta->vgId);
+ tscDebug("%p build fetch msg from only one vgroup, vgId:%d", pSql, pTableMeta->vgId);
}
pSql->cmd.payloadLen = sizeof(SRetrieveTableMsg);
@@ -535,7 +534,6 @@ int tscBuildSubmitMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
// NOTE: shell message size should not include SMsgDesc
int32_t size = pSql->cmd.payloadLen - sizeof(SMsgDesc);
- int32_t vgId = pTableMeta->vgroupInfo.vgId;
SMsgDesc* pMsgDesc = (SMsgDesc*) pMsg;
pMsgDesc->numOfVnodes = htonl(1); // always one vnode
@@ -543,7 +541,7 @@ int tscBuildSubmitMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
pMsg += sizeof(SMsgDesc);
SSubmitMsg *pShellMsg = (SSubmitMsg *)pMsg;
- pShellMsg->header.vgId = htonl(vgId);
+ pShellMsg->header.vgId = htonl(pTableMeta->vgId);
pShellMsg->header.contLen = htonl(size); // the length not includes the size of SMsgDesc
pShellMsg->length = pShellMsg->header.contLen;
@@ -551,9 +549,9 @@ int tscBuildSubmitMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
// pSql->cmd.payloadLen is set during copying data into payload
pSql->cmd.msgType = TSDB_MSG_TYPE_SUBMIT;
- tscDumpEpSetFromVgroupInfo(&pTableMeta->corVgroupInfo, &pSql->epSet);
+ tscDumpEpSetFromVgroupInfo(&pSql->epSet, &pTableMeta->corVgroupInfo);
- tscDebug("%p build submit msg, vgId:%d numOfTables:%d numberOfEP:%d", pSql, vgId, pSql->cmd.numOfTablesInSubmit,
+ tscDebug("%p build submit msg, vgId:%d numOfTables:%d numberOfEP:%d", pSql, pTableMeta->vgId, pSql->cmd.numOfTablesInSubmit,
pSql->epSet.numOfEps);
return TSDB_CODE_SUCCESS;
}
@@ -597,24 +595,28 @@ static char *doSerializeTableInfo(SQueryTableMsg* pQueryMsg, SSqlObj *pSql, char
STableMeta * pTableMeta = pTableMetaInfo->pTableMeta;
if (UTIL_TABLE_IS_NORMAL_TABLE(pTableMetaInfo) || pTableMetaInfo->pVgroupTables == NULL) {
- SVgroupInfo* pVgroupInfo = NULL;
+ int32_t vgId = -1;
if (UTIL_TABLE_IS_SUPER_TABLE(pTableMetaInfo)) {
int32_t index = pTableMetaInfo->vgroupIndex;
assert(index >= 0);
-
+
+ SVgroupInfo* pVgroupInfo = NULL;
if (pTableMetaInfo->vgroupList->numOfVgroups > 0) {
assert(index < pTableMetaInfo->vgroupList->numOfVgroups);
pVgroupInfo = &pTableMetaInfo->vgroupList->vgroups[index];
}
+
+ vgId = pVgroupInfo->vgId;
+ tscSetDnodeEpSet(&pSql->epSet, pVgroupInfo);
tscDebug("%p query on stable, vgIndex:%d, numOfVgroups:%d", pSql, index, pTableMetaInfo->vgroupList->numOfVgroups);
} else {
- pVgroupInfo = &pTableMeta->vgroupInfo;
+ vgId = pTableMeta->vgId;
+ tscDumpEpSetFromVgroupInfo(&pSql->epSet, &pTableMeta->corVgroupInfo);
}
- assert(pVgroupInfo != NULL);
+ pSql->epSet.inUse = rand()%pSql->epSet.numOfEps;
- tscSetDnodeEpSet(pSql, pVgroupInfo);
- pQueryMsg->head.vgId = htonl(pVgroupInfo->vgId);
+ pQueryMsg->head.vgId = htonl(vgId);
STableIdInfo *pTableIdInfo = (STableIdInfo *)pMsg;
pTableIdInfo->tid = htonl(pTableMeta->id.tid);
@@ -633,7 +635,7 @@ static char *doSerializeTableInfo(SQueryTableMsg* pQueryMsg, SSqlObj *pSql, char
SVgroupTableInfo* pTableIdList = taosArrayGet(pTableMetaInfo->pVgroupTables, index);
// set the vgroup info
- tscSetDnodeEpSet(pSql, &pTableIdList->vgInfo);
+ tscSetDnodeEpSet(&pSql->epSet, &pTableIdList->vgInfo);
pQueryMsg->head.vgId = htonl(pTableIdList->vgInfo.vgId);
int32_t numOfTables = (int32_t)taosArrayGetSize(pTableIdList->itemList);
@@ -888,13 +890,13 @@ int tscBuildQueryMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
for (int32_t j = 0; j < pGroupbyExpr->numOfGroupCols; ++j) {
SColIndex* pCol = taosArrayGet(pGroupbyExpr->columnInfo, j);
- *((int16_t *)pMsg) = pCol->colId;
+ *((int16_t *)pMsg) = htons(pCol->colId);
pMsg += sizeof(pCol->colId);
- *((int16_t *)pMsg) += pCol->colIndex;
+ *((int16_t *)pMsg) += htons(pCol->colIndex);
pMsg += sizeof(pCol->colIndex);
- *((int16_t *)pMsg) += pCol->flag;
+ *((int16_t *)pMsg) += htons(pCol->flag);
pMsg += sizeof(pCol->flag);
memcpy(pMsg, pCol->name, tListLen(pCol->name));
@@ -1247,7 +1249,7 @@ int32_t tscBuildShowMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
pShowMsg->payloadLen = htons(pEpAddr->n);
}
- pCmd->payloadLen = sizeof(SShowMsg) + pShowMsg->payloadLen;
+ pCmd->payloadLen = sizeof(SShowMsg) + htons(pShowMsg->payloadLen);
return TSDB_CODE_SUCCESS;
}
@@ -1448,48 +1450,11 @@ int tscBuildUpdateTagMsg(SSqlObj* pSql, SSqlInfo *pInfo) {
SQueryInfo * pQueryInfo = tscGetQueryInfoDetail(pCmd, 0);
STableMetaInfo *pTableMetaInfo = tscGetMetaInfo(pQueryInfo, 0);
- tscDumpEpSetFromVgroupInfo(&pTableMetaInfo->pTableMeta->corVgroupInfo, &pSql->epSet);
+ tscDumpEpSetFromVgroupInfo(&pSql->epSet, &pTableMetaInfo->pTableMeta->corVgroupInfo);
return TSDB_CODE_SUCCESS;
}
-//int tscBuildCancelQueryMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
-// SCancelQueryMsg *pCancelMsg = (SCancelQueryMsg*) pSql->cmd.payload;
-// pCancelMsg->qhandle = htobe64(pSql->res.qhandle);
-//
-// SQueryInfo *pQueryInfo = tscGetQueryInfoDetail(&pSql->cmd, pSql->cmd.clauseIndex);
-// STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, 0);
-//
-// if (UTIL_TABLE_IS_SUPER_TABLE(pTableMetaInfo)) {
-// int32_t vgIndex = pTableMetaInfo->vgroupIndex;
-// if (pTableMetaInfo->pVgroupTables == NULL) {
-// SVgroupsInfo *pVgroupInfo = pTableMetaInfo->vgroupList;
-// assert(pVgroupInfo->vgroups[vgIndex].vgId > 0 && vgIndex < pTableMetaInfo->vgroupList->numOfVgroups);
-//
-// pCancelMsg->header.vgId = htonl(pVgroupInfo->vgroups[vgIndex].vgId);
-// tscDebug("%p build cancel query msg from vgId:%d, vgIndex:%d", pSql, pVgroupInfo->vgroups[vgIndex].vgId, vgIndex);
-// } else {
-// int32_t numOfVgroups = (int32_t)taosArrayGetSize(pTableMetaInfo->pVgroupTables);
-// assert(vgIndex >= 0 && vgIndex < numOfVgroups);
-//
-// SVgroupTableInfo* pTableIdList = taosArrayGet(pTableMetaInfo->pVgroupTables, vgIndex);
-//
-// pCancelMsg->header.vgId = htonl(pTableIdList->vgInfo.vgId);
-// tscDebug("%p build cancel query msg from vgId:%d, vgIndex:%d", pSql, pTableIdList->vgInfo.vgId, vgIndex);
-// }
-// } else {
-// STableMeta* pTableMeta = pTableMetaInfo->pTableMeta;
-// pCancelMsg->header.vgId = htonl(pTableMeta->vgroupInfo.vgId);
-// tscDebug("%p build cancel query msg from only one vgroup, vgId:%d", pSql, pTableMeta->vgroupInfo.vgId);
-// }
-//
-// pSql->cmd.payloadLen = sizeof(SCancelQueryMsg);
-// pSql->cmd.msgType = TSDB_MSG_TYPE_CANCEL_QUERY;
-//
-// pCancelMsg->header.contLen = htonl(sizeof(SCancelQueryMsg));
-// return TSDB_CODE_SUCCESS;
-//}
-
int tscAlterDbMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
SSqlCmd *pCmd = &pSql->cmd;
pCmd->payloadLen = sizeof(SAlterDbMsg);
diff --git a/src/client/src/tscSql.c b/src/client/src/tscSql.c
index bb0d8005c2..fa7bc99a9f 100644
--- a/src/client/src/tscSql.c
+++ b/src/client/src/tscSql.c
@@ -314,7 +314,7 @@ static void waitForRetrieveRsp(void *param, TAOS_RES *tres, int numOfRows) {
tsem_post(&pSql->rspSem);
}
-TAOS_RES* taos_query_c(TAOS *taos, const char *sqlstr, uint32_t sqlLen, TAOS_RES** res) {
+TAOS_RES* taos_query_c(TAOS *taos, const char *sqlstr, uint32_t sqlLen, int64_t* res) {
STscObj *pObj = (STscObj *)taos;
if (pObj == NULL || pObj->signature != pObj) {
terrno = TSDB_CODE_TSC_DISCONNECTED;
@@ -340,7 +340,7 @@ TAOS_RES* taos_query_c(TAOS *taos, const char *sqlstr, uint32_t sqlLen, TAOS_RES
doAsyncQuery(pObj, pSql, waitForQueryRsp, taos, sqlstr, sqlLen);
if (res != NULL) {
- *res = pSql;
+ atomic_store_64(res, pSql->self);
}
tsem_wait(&pSql->rspSem);
@@ -351,7 +351,7 @@ TAOS_RES* taos_query(TAOS *taos, const char *sqlstr) {
return taos_query_c(taos, sqlstr, (uint32_t)strlen(sqlstr), NULL);
}
-TAOS_RES* taos_query_h(TAOS* taos, const char *sqlstr, TAOS_RES** res) {
+TAOS_RES* taos_query_h(TAOS* taos, const char *sqlstr, int64_t* res) {
return taos_query_c(taos, sqlstr, (uint32_t) strlen(sqlstr), res);
}
diff --git a/src/client/src/tscSub.c b/src/client/src/tscSub.c
index 52b74f7502..7f0b174ad3 100644
--- a/src/client/src/tscSub.c
+++ b/src/client/src/tscSub.c
@@ -69,14 +69,17 @@ TSKEY tscGetSubscriptionProgress(void* sub, int64_t uid, TSKEY dflt) {
}
void tscUpdateSubscriptionProgress(void* sub, int64_t uid, TSKEY ts) {
- if( sub == NULL)
+ if( sub == NULL) {
return;
+ }
+
SSub* pSub = (SSub*)sub;
SSubscriptionProgress target = {.uid = uid, .key = ts};
SSubscriptionProgress* p = taosArraySearch(pSub->progress, &target, tscCompareSubscriptionProgress);
if (p != NULL) {
p->key = ts;
+ tscDebug("subscribe:%s, uid:%"PRIu64" update sub start ts:%"PRId64, pSub->topic, p->uid, p->key);
}
}
@@ -502,6 +505,7 @@ TAOS_RES *taos_consume(TAOS_SUB *tsub) {
SQueryInfo *pQueryInfo = tscGetQueryInfoDetail(pCmd, 0);
if (taosArrayGetSize(pSub->progress) > 0) { // fix crash in single tabel subscription
pQueryInfo->window.skey = ((SSubscriptionProgress*)taosArrayGet(pSub->progress, 0))->key;
+ tscDebug("subscribe:%s set subscribe skey:%"PRId64, pSub->topic, pQueryInfo->window.skey);
}
if (pSub->pTimer == NULL) {
diff --git a/src/client/src/tscSystem.c b/src/client/src/tscSystem.c
index d98ab2facc..ff605dad72 100644
--- a/src/client/src/tscSystem.c
+++ b/src/client/src/tscSystem.c
@@ -31,17 +31,16 @@
#include "tlocale.h"
// global, not configurable
-SCacheObj* tscMetaCache;
+SCacheObj *tscMetaCache; // table meta cache
+SHashObj *tscHashMap; // hash map to keep the global vgroup info
int tscObjRef = -1;
-void * tscTmr;
-void * tscQhandle;
-void * tscCheckDiskUsageTmr;
+void *tscTmr;
+void *tscQhandle;
+void *tscCheckDiskUsageTmr;
int tscRefId = -1;
-
-int tscNumOfThreads;
+int tscNumOfObj = 0; // number of sqlObj in current process.
static pthread_once_t tscinit = PTHREAD_ONCE_INIT;
-//void tscUpdateEpSet(void *ahandle, SRpcEpSet *pEpSet);
void tscCheckDiskUsage(void *UNUSED_PARAM(para), void* UNUSED_PARAM(param)) {
taosGetDisk();
@@ -114,7 +113,7 @@ void taos_init_imp(void) {
int queueSize = tsMaxConnections*2;
double factor = (tscEmbedded == 0)? 2.0:4.0;
- tscNumOfThreads = (int)(tsNumOfCores * tsNumOfThreadsPerCore / factor);
+ int32_t tscNumOfThreads = (int)(tsNumOfCores * tsNumOfThreadsPerCore / factor);
if (tscNumOfThreads < 2) {
tscNumOfThreads = 2;
}
@@ -133,7 +132,8 @@ void taos_init_imp(void) {
int64_t refreshTime = 10; // 10 seconds by default
if (tscMetaCache == NULL) {
tscMetaCache = taosCacheInit(TSDB_DATA_TYPE_BINARY, refreshTime, false, tscFreeTableMetaHelper, "tableMeta");
- tscObjRef = taosOpenRef(40960, tscFreeRegisteredSqlObj);
+ tscObjRef = taosOpenRef(40960, tscFreeRegisteredSqlObj);
+ tscHashMap = taosHashInit(1024, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), true, HASH_ENTRY_LOCK);
}
tscRefId = taosOpenRef(200, tscCloseTscObj);
diff --git a/src/client/src/tscUtil.c b/src/client/src/tscUtil.c
index 2991e89581..172887c110 100644
--- a/src/client/src/tscUtil.c
+++ b/src/client/src/tscUtil.c
@@ -458,21 +458,19 @@ void tscFreeRegisteredSqlObj(void *pSql) {
SSqlObj* p = *(SSqlObj**)pSql;
STscObj* pTscObj = p->pTscObj;
- assert(p->self != 0);
+ assert(RID_VALID(p->self));
+
tscFreeSqlObj(p);
taosReleaseRef(tscRefId, pTscObj->rid);
+
+ int32_t num = atomic_sub_fetch_32(&pTscObj->numOfObj, 1);
+ int32_t total = atomic_sub_fetch_32(&tscNumOfObj, 1);
+ tscDebug("%p free SqlObj, total in tscObj:%d, total:%d", pSql, num, total);
}
void tscFreeTableMetaHelper(void *pTableMeta) {
STableMeta* p = (STableMeta*) pTableMeta;
- int32_t numOfEps = p->vgroupInfo.numOfEps;
- assert(numOfEps >= 0 && numOfEps <= TSDB_MAX_REPLICA);
-
- for(int32_t i = 0; i < numOfEps; ++i) {
- tfree(p->vgroupInfo.epAddr[i].fqdn);
- }
-
int32_t numOfEps1 = p->corVgroupInfo.numOfEps;
assert(numOfEps1 >= 0 && numOfEps1 <= TSDB_MAX_REPLICA);
@@ -1912,6 +1910,10 @@ void tscResetForNextRetrieve(SSqlRes* pRes) {
void registerSqlObj(SSqlObj* pSql) {
taosAcquireRef(tscRefId, pSql->pTscObj->rid);
pSql->self = taosAddRef(tscObjRef, pSql);
+
+ int32_t num = atomic_add_fetch_32(&pSql->pTscObj->numOfObj, 1);
+ int32_t total = atomic_add_fetch_32(&tscNumOfObj, 1);
+ tscDebug("%p new SqlObj from %p, total in tscObj:%d, total:%d", pSql, pSql->pTscObj, num, total);
}
SSqlObj* createSimpleSubObj(SSqlObj* pSql, void (*fp)(), void* param, int32_t cmd) {
@@ -1941,30 +1943,24 @@ SSqlObj* createSimpleSubObj(SSqlObj* pSql, void (*fp)(), void* param, int32_t cm
return NULL;
}
- pNew->fp = fp;
+ pNew->fp = fp;
pNew->fetchFp = fp;
- pNew->param = param;
+ pNew->param = param;
+ pNew->sqlstr = NULL;
pNew->maxRetry = TSDB_MAX_REPLICA;
- pNew->sqlstr = strdup(pSql->sqlstr);
- if (pNew->sqlstr == NULL) {
- tscError("%p new subquery failed", pSql);
- tscFreeSqlObj(pNew);
- return NULL;
- }
-
SQueryInfo* pQueryInfo = tscGetQueryInfoDetailSafely(pCmd, 0);
assert(pSql->cmd.clauseIndex == 0);
STableMetaInfo* pMasterTableMetaInfo = tscGetTableMetaInfoFromCmd(&pSql->cmd, pSql->cmd.clauseIndex, 0);
tscAddTableMetaInfo(pQueryInfo, pMasterTableMetaInfo->name, NULL, NULL, NULL, NULL);
-
registerSqlObj(pNew);
+
return pNew;
}
-static void doSetSqlExprAndResultFieldInfo(SQueryInfo* pQueryInfo, SQueryInfo* pNewQueryInfo, int64_t uid) {
+static void doSetSqlExprAndResultFieldInfo(SQueryInfo* pNewQueryInfo, int64_t uid) {
int32_t numOfOutput = (int32_t)tscSqlExprNumOfExprs(pNewQueryInfo);
if (numOfOutput == 0) {
return;
@@ -2017,15 +2013,9 @@ SSqlObj* createSubqueryObj(SSqlObj* pSql, int16_t tableIndex, void (*fp)(), void
STableMetaInfo* pTableMetaInfo = tscGetTableMetaInfoFromCmd(pCmd, pCmd->clauseIndex, tableIndex);
- pNew->pTscObj = pSql->pTscObj;
+ pNew->pTscObj = pSql->pTscObj;
pNew->signature = pNew;
-
- pNew->sqlstr = strdup(pSql->sqlstr);
- if (pNew->sqlstr == NULL) {
- tscError("%p new subquery failed, tableIndex:%d, vgroupIndex:%d", pSql, tableIndex, pTableMetaInfo->vgroupIndex);
- terrno = TSDB_CODE_TSC_OUT_OF_MEMORY;
- goto _error;
- }
+ pNew->sqlstr = NULL;
SSqlCmd* pnCmd = &pNew->cmd;
memcpy(pnCmd, pCmd, sizeof(SSqlCmd));
@@ -2113,23 +2103,22 @@ SSqlObj* createSubqueryObj(SSqlObj* pSql, int16_t tableIndex, void (*fp)(), void
goto _error;
}
- doSetSqlExprAndResultFieldInfo(pQueryInfo, pNewQueryInfo, uid);
+ doSetSqlExprAndResultFieldInfo(pNewQueryInfo, uid);
- pNew->fp = fp;
+ pNew->fp = fp;
pNew->fetchFp = fp;
-
- pNew->param = param;
+ pNew->param = param;
pNew->maxRetry = TSDB_MAX_REPLICA;
char* name = pTableMetaInfo->name;
STableMetaInfo* pFinalInfo = NULL;
- if (pPrevSql == NULL) {
- STableMeta* pTableMeta = taosCacheAcquireByData(tscMetaCache, pTableMetaInfo->pTableMeta); // get by name may failed due to the cache cleanup
+ if (pPrevSql == NULL) { // get by name may failed due to the cache cleanup
+ STableMeta* pTableMeta = taosCacheAcquireByData(tscMetaCache, pTableMetaInfo->pTableMeta);
assert(pTableMeta != NULL);
pFinalInfo = tscAddTableMetaInfo(pNewQueryInfo, name, pTableMeta, pTableMetaInfo->vgroupList,
- pTableMetaInfo->tagColList, pTableMetaInfo->pVgroupTables);
+ pTableMetaInfo->tagColList, pTableMetaInfo->pVgroupTables);
} else { // transfer the ownership of pTableMeta to the newly create sql object.
STableMetaInfo* pPrevInfo = tscGetTableMetaInfoFromCmd(&pPrevSql->cmd, pPrevSql->cmd.clauseIndex, 0);
diff --git a/src/common/inc/tglobal.h b/src/common/inc/tglobal.h
index bf1f22a4ee..f1fc5ca808 100644
--- a/src/common/inc/tglobal.h
+++ b/src/common/inc/tglobal.h
@@ -32,8 +32,8 @@ extern uint16_t tsSyncPort;
extern uint16_t tsArbitratorPort;
extern int32_t tsStatusInterval;
extern int32_t tsNumOfMnodes;
-extern int32_t tsEnableVnodeBak;
-extern int32_t tsEnableTelemetryReporting;
+extern int8_t tsEnableVnodeBak;
+extern int8_t tsEnableTelemetryReporting;
extern char tsEmail[];
extern char tsArbitrator[];
@@ -51,7 +51,7 @@ extern int8_t tsDaylight;
extern char tsTimezone[];
extern char tsLocale[];
extern char tsCharset[]; // default encode string
-extern int32_t tsEnableCoreFile;
+extern int8_t tsEnableCoreFile;
extern int32_t tsCompressMsgSize;
extern char tsTempDir[];
@@ -59,12 +59,12 @@ extern char tsTempDir[];
extern int32_t tsQueryBufferSize; // maximum allowed usage buffer for each data node during query processing
extern int32_t tsRetrieveBlockingModel;// retrieve threads will be blocked
-extern int32_t tsKeepOriginalColumnName;
+extern int8_t tsKeepOriginalColumnName;
// client
extern int32_t tsTableMetaKeepTimer;
extern int32_t tsMaxSQLStringLen;
-extern int32_t tsTscEnableRecordSql;
+extern int8_t tsTscEnableRecordSql;
extern int32_t tsMaxNumOfOrderedResults;
extern int32_t tsMinSlidingTime;
extern int32_t tsMinIntervalTime;
@@ -93,48 +93,51 @@ extern int16_t tsWAL;
extern int32_t tsFsyncPeriod;
extern int32_t tsReplications;
extern int32_t tsQuorum;
-extern int32_t tsUpdate;
+extern int8_t tsUpdate;
+extern int8_t tsCacheLastRow;
// balance
-extern int32_t tsEnableBalance;
-extern int32_t tsAlternativeRole;
+extern int8_t tsEnableBalance;
+extern int8_t tsAlternativeRole;
extern int32_t tsBalanceInterval;
extern int32_t tsOfflineThreshold;
extern int32_t tsMnodeEqualVnodeNum;
-extern int32_t tsFlowCtrl;
+extern int8_t tsEnableFlowCtrl;
+extern int8_t tsEnableSlaveQuery;
+extern int8_t tsEnableAdjustMaster;
// restful
-extern int32_t tsEnableHttpModule;
+extern int8_t tsEnableHttpModule;
extern int32_t tsRestRowLimit;
extern uint16_t tsHttpPort;
extern int32_t tsHttpCacheSessions;
extern int32_t tsHttpSessionExpire;
extern int32_t tsHttpMaxThreads;
-extern int32_t tsHttpEnableCompress;
-extern int32_t tsHttpEnableRecordSql;
-extern int32_t tsTelegrafUseFieldNum;
+extern int8_t tsHttpEnableCompress;
+extern int8_t tsHttpEnableRecordSql;
+extern int8_t tsTelegrafUseFieldNum;
// mqtt
-extern int32_t tsEnableMqttModule;
-extern char tsMqttHostName[];
-extern char tsMqttPort[];
-extern char tsMqttUser[];
-extern char tsMqttPass[];
-extern char tsMqttClientId[];
-extern char tsMqttTopic[];
+extern int8_t tsEnableMqttModule;
+extern char tsMqttHostName[];
+extern char tsMqttPort[];
+extern char tsMqttUser[];
+extern char tsMqttPass[];
+extern char tsMqttClientId[];
+extern char tsMqttTopic[];
// monitor
-extern int32_t tsEnableMonitorModule;
+extern int8_t tsEnableMonitorModule;
extern char tsMonitorDbName[];
extern char tsInternalPass[];
extern int32_t tsMonitorInterval;
// stream
-extern int32_t tsEnableStream;
+extern int8_t tsEnableStream;
// internal
-extern int32_t tsPrintAuth;
-extern uint32_t tscEmbedded;
+extern int8_t tsPrintAuth;
+extern int8_t tscEmbedded;
extern char configDir[];
extern char tsVnodeDir[];
extern char tsDnodeDir[];
@@ -161,7 +164,7 @@ extern float tsMinimalLogDirGB;
extern float tsReservedTmpDirectorySpace;
extern float tsMinimalDataDirGB;
extern int32_t tsTotalMemoryMB;
-extern int32_t tsVersion;
+extern uint32_t tsVersion;
// build info
extern char version[];
@@ -171,13 +174,13 @@ extern char gitinfoOfInternal[];
extern char buildinfo[];
// log
-extern int32_t tsAsyncLog;
+extern int8_t tsAsyncLog;
extern int32_t tsNumOfLogLines;
extern int32_t tsLogKeepDays;
extern int32_t dDebugFlag;
extern int32_t vDebugFlag;
extern int32_t mDebugFlag;
-extern uint32_t cDebugFlag;
+extern int32_t cDebugFlag;
extern int32_t jniDebugFlag;
extern int32_t tmrDebugFlag;
extern int32_t sdbDebugFlag;
@@ -187,7 +190,7 @@ extern int32_t monDebugFlag;
extern int32_t uDebugFlag;
extern int32_t rpcDebugFlag;
extern int32_t odbcDebugFlag;
-extern uint32_t qDebugFlag;
+extern int32_t qDebugFlag;
extern int32_t wDebugFlag;
extern int32_t cqDebugFlag;
extern int32_t debugFlag;
diff --git a/src/common/inc/tulog.h b/src/common/inc/tulog.h
index 74f572619b..566da40a10 100644
--- a/src/common/inc/tulog.h
+++ b/src/common/inc/tulog.h
@@ -23,7 +23,7 @@ extern "C" {
#include "tlog.h"
extern int32_t uDebugFlag;
-extern uint32_t tscEmbedded;
+extern int8_t tscEmbedded;
#define uFatal(...) { if (uDebugFlag & DEBUG_FATAL) { taosPrintLog("UTL FATAL", tscEmbedded ? 255 : uDebugFlag, __VA_ARGS__); }}
#define uError(...) { if (uDebugFlag & DEBUG_ERROR) { taosPrintLog("UTL ERROR ", tscEmbedded ? 255 : uDebugFlag, __VA_ARGS__); }}
diff --git a/src/common/src/tglobal.c b/src/common/src/tglobal.c
index f007a82f84..8fa17f8751 100644
--- a/src/common/src/tglobal.c
+++ b/src/common/src/tglobal.c
@@ -39,8 +39,8 @@ uint16_t tsSyncPort = 6040;
uint16_t tsArbitratorPort = 6042;
int32_t tsStatusInterval = 1; // second
int32_t tsNumOfMnodes = 3;
-int32_t tsEnableVnodeBak = 1;
-int32_t tsEnableTelemetryReporting = 1;
+int8_t tsEnableVnodeBak = 1;
+int8_t tsEnableTelemetryReporting = 1;
char tsEmail[TSDB_FQDN_LEN] = {0};
// common
@@ -56,7 +56,7 @@ int8_t tsDaylight = 0;
char tsTimezone[TSDB_TIMEZONE_LEN] = {0};
char tsLocale[TSDB_LOCALE_LEN] = {0};
char tsCharset[TSDB_LOCALE_LEN] = {0}; // default encode string
-int32_t tsEnableCoreFile = 0;
+int8_t tsEnableCoreFile = 0;
int32_t tsMaxBinaryDisplayWidth = 30;
char tsTempDir[TSDB_FILENAME_LEN] = "/tmp/";
@@ -73,7 +73,7 @@ int32_t tsCompressMsgSize = -1;
// client
int32_t tsTableMetaKeepTimer = 7200; // second
int32_t tsMaxSQLStringLen = TSDB_MAX_SQL_LEN;
-int32_t tsTscEnableRecordSql = 0;
+int8_t tsTscEnableRecordSql = 0;
// the maximum number of results for projection query on super table that are returned from
// one virtual node, to order according to timestamp
@@ -110,7 +110,7 @@ int32_t tsQueryBufferSize = -1;
int32_t tsRetrieveBlockingModel = 0;
// last_row(*), first(*), last_row(ts, col1, col2) query, the result fields will be the original column name
-int32_t tsKeepOriginalColumnName = 0;
+int8_t tsKeepOriginalColumnName = 0;
// db parameters
int32_t tsCacheBlockSize = TSDB_DEFAULT_CACHE_BLOCK_SIZE;
@@ -126,33 +126,36 @@ int16_t tsWAL = TSDB_DEFAULT_WAL_LEVEL;
int32_t tsFsyncPeriod = TSDB_DEFAULT_FSYNC_PERIOD;
int32_t tsReplications = TSDB_DEFAULT_DB_REPLICA_OPTION;
int32_t tsQuorum = TSDB_DEFAULT_DB_QUORUM_OPTION;
-int32_t tsUpdate = TSDB_DEFAULT_DB_UPDATE_OPTION;
+int8_t tsUpdate = TSDB_DEFAULT_DB_UPDATE_OPTION;
+int8_t tsCacheLastRow = TSDB_DEFAULT_CACHE_BLOCK_SIZE;
int32_t tsMaxVgroupsPerDb = 0;
int32_t tsMinTablePerVnode = TSDB_TABLES_STEP;
int32_t tsMaxTablePerVnode = TSDB_DEFAULT_TABLES;
int32_t tsTableIncStepPerVnode = TSDB_TABLES_STEP;
// balance
-int32_t tsEnableBalance = 1;
-int32_t tsAlternativeRole = 0;
-int32_t tsBalanceInterval = 300; // seconds
-int32_t tsOfflineThreshold = 86400*100; // seconds 10days
+int8_t tsEnableBalance = 1;
+int8_t tsAlternativeRole = 0;
+int32_t tsBalanceInterval = 300; // seconds
+int32_t tsOfflineThreshold = 86400 * 100; // seconds 10days
int32_t tsMnodeEqualVnodeNum = 4;
-int32_t tsFlowCtrl = 1;
+int8_t tsEnableFlowCtrl = 1;
+int8_t tsEnableSlaveQuery = 1;
+int8_t tsEnableAdjustMaster = 1;
// restful
-int32_t tsEnableHttpModule = 1;
+int8_t tsEnableHttpModule = 1;
int32_t tsRestRowLimit = 10240;
uint16_t tsHttpPort = 6041; // only tcp, range tcp[6041]
int32_t tsHttpCacheSessions = 1000;
int32_t tsHttpSessionExpire = 36000;
int32_t tsHttpMaxThreads = 2;
-int32_t tsHttpEnableCompress = 1;
-int32_t tsHttpEnableRecordSql = 0;
-int32_t tsTelegrafUseFieldNum = 0;
+int8_t tsHttpEnableCompress = 1;
+int8_t tsHttpEnableRecordSql = 0;
+int8_t tsTelegrafUseFieldNum = 0;
// mqtt
-int32_t tsEnableMqttModule = 0; // not finished yet, not started it by default
+int8_t tsEnableMqttModule = 0; // not finished yet, not started it by default
char tsMqttHostName[TSDB_MQTT_HOSTNAME_LEN] = "test.mosquitto.org";
char tsMqttPort[TSDB_MQTT_PORT_LEN] = "1883";
char tsMqttUser[TSDB_MQTT_USER_LEN] = {0};
@@ -161,24 +164,24 @@ char tsMqttClientId[TSDB_MQTT_CLIENT_ID_LEN] = "TDengineMqttSubscriber";
char tsMqttTopic[TSDB_MQTT_TOPIC_LEN] = "/test"; // #
// monitor
-int32_t tsEnableMonitorModule = 1;
+int8_t tsEnableMonitorModule = 1;
char tsMonitorDbName[TSDB_DB_NAME_LEN] = "log";
char tsInternalPass[] = "secretkey";
int32_t tsMonitorInterval = 30; // seconds
// stream
-int32_t tsEnableStream = 1;
+int8_t tsEnableStream = 1;
// internal
-int32_t tsPrintAuth = 0;
-uint32_t tscEmbedded = 0;
-char configDir[TSDB_FILENAME_LEN] = {0};
-char tsVnodeDir[TSDB_FILENAME_LEN] = {0};
-char tsDnodeDir[TSDB_FILENAME_LEN] = {0};
-char tsMnodeDir[TSDB_FILENAME_LEN] = {0};
-char tsDataDir[TSDB_FILENAME_LEN] = {0};
-char tsScriptDir[TSDB_FILENAME_LEN] = {0};
-char tsVnodeBakDir[TSDB_FILENAME_LEN] = {0};
+int8_t tsPrintAuth = 0;
+int8_t tscEmbedded = 0;
+char configDir[TSDB_FILENAME_LEN] = {0};
+char tsVnodeDir[TSDB_FILENAME_LEN] = {0};
+char tsDnodeDir[TSDB_FILENAME_LEN] = {0};
+char tsMnodeDir[TSDB_FILENAME_LEN] = {0};
+char tsDataDir[TSDB_FILENAME_LEN] = {0};
+char tsScriptDir[TSDB_FILENAME_LEN] = {0};
+char tsVnodeBakDir[TSDB_FILENAME_LEN] = {0};
/*
* minimum scale for whole system, millisecond by default
@@ -198,10 +201,10 @@ float tsTotalTmpDirGB = 0;
float tsTotalDataDirGB = 0;
float tsAvailTmpDirectorySpace = 0;
float tsAvailDataDirGB = 0;
-float tsReservedTmpDirectorySpace = 0.1f;
-float tsMinimalDataDirGB = 0.5f;
+float tsReservedTmpDirectorySpace = 1.0f;
+float tsMinimalDataDirGB = 1.0f;
int32_t tsTotalMemoryMB = 0;
-int32_t tsVersion = 0;
+uint32_t tsVersion = 0;
// log
int32_t tsNumOfLogLines = 10000000;
@@ -209,13 +212,13 @@ int32_t mDebugFlag = 131;
int32_t sdbDebugFlag = 131;
int32_t dDebugFlag = 135;
int32_t vDebugFlag = 135;
-uint32_t cDebugFlag = 131;
+int32_t cDebugFlag = 131;
int32_t jniDebugFlag = 131;
int32_t odbcDebugFlag = 131;
int32_t httpDebugFlag = 131;
int32_t mqttDebugFlag = 131;
int32_t monDebugFlag = 131;
-uint32_t qDebugFlag = 131;
+int32_t qDebugFlag = 131;
int32_t rpcDebugFlag = 131;
int32_t uDebugFlag = 131;
int32_t debugFlag = 0;
@@ -275,12 +278,16 @@ bool taosCfgDynamicOptions(char *msg) {
for (int32_t i = 0; i < tsGlobalConfigNum; ++i) {
SGlobalCfg *cfg = tsGlobalConfig + i;
//if (!(cfg->cfgType & TSDB_CFG_CTYPE_B_LOG)) continue;
- if (cfg->valType != TAOS_CFG_VTYPE_INT32) continue;
+ if (cfg->valType != TAOS_CFG_VTYPE_INT32 && cfg->valType != TAOS_CFG_VTYPE_INT8) continue;
int32_t cfgLen = (int32_t)strlen(cfg->option);
if (cfgLen != olen) continue;
if (strncasecmp(option, cfg->option, olen) != 0) continue;
- *((int32_t *)cfg->ptr) = vint;
+ if (cfg->valType != TAOS_CFG_VTYPE_INT32) {
+ *((int32_t *)cfg->ptr) = vint;
+ } else {
+ *((int8_t *)cfg->ptr) = (int8_t)vint;
+ }
if (strncasecmp(cfg->option, "monitor", olen) == 0) {
if (1 == vint) {
@@ -468,7 +475,7 @@ static void doInitGlobalConfig(void) {
cfg.option = "vnodeBak";
cfg.ptr = &tsEnableVnodeBak;
- cfg.valType = TAOS_CFG_VTYPE_INT32;
+ cfg.valType = TAOS_CFG_VTYPE_INT8;
cfg.cfgType = TSDB_CFG_CTYPE_B_CONFIG | TSDB_CFG_CTYPE_B_SHOW;
cfg.minValue = 0;
cfg.maxValue = 1;
@@ -478,7 +485,7 @@ static void doInitGlobalConfig(void) {
cfg.option = "telemetryReporting";
cfg.ptr = &tsEnableTelemetryReporting;
- cfg.valType = TAOS_CFG_VTYPE_INT32;
+ cfg.valType = TAOS_CFG_VTYPE_INT8;
cfg.cfgType = TSDB_CFG_CTYPE_B_CONFIG | TSDB_CFG_CTYPE_B_SHOW;
cfg.minValue = 0;
cfg.maxValue = 1;
@@ -488,7 +495,7 @@ static void doInitGlobalConfig(void) {
cfg.option = "balance";
cfg.ptr = &tsEnableBalance;
- cfg.valType = TAOS_CFG_VTYPE_INT32;
+ cfg.valType = TAOS_CFG_VTYPE_INT8;
cfg.cfgType = TSDB_CFG_CTYPE_B_CONFIG | TSDB_CFG_CTYPE_B_SHOW;
cfg.minValue = 0;
cfg.maxValue = 1;
@@ -509,7 +516,7 @@ static void doInitGlobalConfig(void) {
// 0-any; 1-mnode; 2-vnode
cfg.option = "role";
cfg.ptr = &tsAlternativeRole;
- cfg.valType = TAOS_CFG_VTYPE_INT32;
+ cfg.valType = TAOS_CFG_VTYPE_INT8;
cfg.cfgType = TSDB_CFG_CTYPE_B_CONFIG;
cfg.minValue = 0;
cfg.maxValue = 2;
@@ -542,7 +549,7 @@ static void doInitGlobalConfig(void) {
cfg.ptr = &tsOfflineThreshold;
cfg.valType = TAOS_CFG_VTYPE_INT32;
cfg.cfgType = TSDB_CFG_CTYPE_B_CONFIG | TSDB_CFG_CTYPE_B_SHOW;
- cfg.minValue = 5;
+ cfg.minValue = 3;
cfg.maxValue = 7200000;
cfg.ptrLength = 0;
cfg.unitType = TAOS_CFG_UTYPE_SECOND;
@@ -811,7 +818,7 @@ static void doInitGlobalConfig(void) {
cfg.option = "update";
cfg.ptr = &tsUpdate;
- cfg.valType = TAOS_CFG_VTYPE_INT32;
+ cfg.valType = TAOS_CFG_VTYPE_INT8;
cfg.cfgType = TSDB_CFG_CTYPE_B_CONFIG | TSDB_CFG_CTYPE_B_SHOW;
cfg.minValue = TSDB_MIN_DB_UPDATE;
cfg.maxValue = TSDB_MAX_DB_UPDATE;
@@ -901,7 +908,7 @@ static void doInitGlobalConfig(void) {
cfg.option = "keepColumnName";
cfg.ptr = &tsKeepOriginalColumnName;
- cfg.valType = TAOS_CFG_VTYPE_INT32;
+ cfg.valType = TAOS_CFG_VTYPE_INT8;
cfg.cfgType = TSDB_CFG_CTYPE_B_CONFIG | TSDB_CFG_CTYPE_B_SHOW | TSDB_CFG_CTYPE_B_CLIENT;
cfg.minValue = 0;
cfg.maxValue = 1;
@@ -1004,8 +1011,28 @@ static void doInitGlobalConfig(void) {
// module configs
cfg.option = "flowctrl";
- cfg.ptr = &tsFlowCtrl;
- cfg.valType = TAOS_CFG_VTYPE_INT32;
+ cfg.ptr = &tsEnableFlowCtrl;
+ cfg.valType = TAOS_CFG_VTYPE_INT8;
+ cfg.cfgType = TSDB_CFG_CTYPE_B_CONFIG | TSDB_CFG_CTYPE_B_SHOW;
+ cfg.minValue = 0;
+ cfg.maxValue = 1;
+ cfg.ptrLength = 0;
+ cfg.unitType = TAOS_CFG_UTYPE_NONE;
+ taosInitConfigOption(cfg);
+
+ cfg.option = "slaveQuery";
+ cfg.ptr = &tsEnableSlaveQuery;
+ cfg.valType = TAOS_CFG_VTYPE_INT8;
+ cfg.cfgType = TSDB_CFG_CTYPE_B_CONFIG | TSDB_CFG_CTYPE_B_SHOW;
+ cfg.minValue = 0;
+ cfg.maxValue = 1;
+ cfg.ptrLength = 0;
+ cfg.unitType = TAOS_CFG_UTYPE_NONE;
+ taosInitConfigOption(cfg);
+
+ cfg.option = "adjustMaster";
+ cfg.ptr = &tsEnableAdjustMaster;
+ cfg.valType = TAOS_CFG_VTYPE_INT8;
cfg.cfgType = TSDB_CFG_CTYPE_B_CONFIG | TSDB_CFG_CTYPE_B_SHOW;
cfg.minValue = 0;
cfg.maxValue = 1;
@@ -1015,7 +1042,7 @@ static void doInitGlobalConfig(void) {
cfg.option = "http";
cfg.ptr = &tsEnableHttpModule;
- cfg.valType = TAOS_CFG_VTYPE_INT32;
+ cfg.valType = TAOS_CFG_VTYPE_INT8;
cfg.cfgType = TSDB_CFG_CTYPE_B_CONFIG | TSDB_CFG_CTYPE_B_SHOW;
cfg.minValue = 0;
cfg.maxValue = 1;
@@ -1025,7 +1052,7 @@ static void doInitGlobalConfig(void) {
cfg.option = "mqtt";
cfg.ptr = &tsEnableMqttModule;
- cfg.valType = TAOS_CFG_VTYPE_INT32;
+ cfg.valType = TAOS_CFG_VTYPE_INT8;
cfg.cfgType = TSDB_CFG_CTYPE_B_CONFIG | TSDB_CFG_CTYPE_B_SHOW;
cfg.minValue = 0;
cfg.maxValue = 1;
@@ -1035,7 +1062,7 @@ static void doInitGlobalConfig(void) {
cfg.option = "monitor";
cfg.ptr = &tsEnableMonitorModule;
- cfg.valType = TAOS_CFG_VTYPE_INT32;
+ cfg.valType = TAOS_CFG_VTYPE_INT8;
cfg.cfgType = TSDB_CFG_CTYPE_B_CONFIG | TSDB_CFG_CTYPE_B_SHOW;
cfg.minValue = 0;
cfg.maxValue = 1;
@@ -1045,7 +1072,7 @@ static void doInitGlobalConfig(void) {
cfg.option = "stream";
cfg.ptr = &tsEnableStream;
- cfg.valType = TAOS_CFG_VTYPE_INT32;
+ cfg.valType = TAOS_CFG_VTYPE_INT8;
cfg.cfgType = TSDB_CFG_CTYPE_B_CONFIG | TSDB_CFG_CTYPE_B_SHOW;
cfg.minValue = 0;
cfg.maxValue = 1;
@@ -1055,7 +1082,7 @@ static void doInitGlobalConfig(void) {
cfg.option = "httpEnableRecordSql";
cfg.ptr = &tsHttpEnableRecordSql;
- cfg.valType = TAOS_CFG_VTYPE_INT32;
+ cfg.valType = TAOS_CFG_VTYPE_INT8;
cfg.cfgType = TSDB_CFG_CTYPE_B_CONFIG;
cfg.minValue = 0;
cfg.maxValue = 1;
@@ -1065,7 +1092,7 @@ static void doInitGlobalConfig(void) {
cfg.option = "telegrafUseFieldNum";
cfg.ptr = &tsTelegrafUseFieldNum;
- cfg.valType = TAOS_CFG_VTYPE_INT32;
+ cfg.valType = TAOS_CFG_VTYPE_INT8;
cfg.cfgType = TSDB_CFG_CTYPE_B_CONFIG | TSDB_CFG_CTYPE_B_SHOW;
cfg.minValue = 0;
cfg.maxValue = 1;
@@ -1116,7 +1143,7 @@ static void doInitGlobalConfig(void) {
cfg.option = "asyncLog";
cfg.ptr = &tsAsyncLog;
- cfg.valType = TAOS_CFG_VTYPE_INT16;
+ cfg.valType = TAOS_CFG_VTYPE_INT8;
cfg.cfgType = TSDB_CFG_CTYPE_B_CONFIG | TSDB_CFG_CTYPE_B_LOG | TSDB_CFG_CTYPE_B_CLIENT;
cfg.minValue = 0;
cfg.maxValue = 1;
@@ -1317,7 +1344,7 @@ static void doInitGlobalConfig(void) {
cfg.option = "enableRecordSql";
cfg.ptr = &tsTscEnableRecordSql;
- cfg.valType = TAOS_CFG_VTYPE_INT32;
+ cfg.valType = TAOS_CFG_VTYPE_INT8;
cfg.cfgType = TSDB_CFG_CTYPE_B_CONFIG;
cfg.minValue = 0;
cfg.maxValue = 1;
@@ -1327,7 +1354,7 @@ static void doInitGlobalConfig(void) {
cfg.option = "enableCoreFile";
cfg.ptr = &tsEnableCoreFile;
- cfg.valType = TAOS_CFG_VTYPE_INT32;
+ cfg.valType = TAOS_CFG_VTYPE_INT8;
cfg.cfgType = TSDB_CFG_CTYPE_B_CONFIG;
cfg.minValue = 0;
cfg.maxValue = 1;
@@ -1451,15 +1478,20 @@ int32_t taosCheckGlobalCfg() {
// todo refactor
tsVersion = 0;
- for (int i = 0; i < 10; i++) {
+ for (int ver = 0, i = 0; i < TSDB_VERSION_LEN; ++i) {
if (version[i] >= '0' && version[i] <= '9') {
- tsVersion = tsVersion * 10 + (version[i] - '0');
+ ver = ver * 10 + (version[i] - '0');
+ } else if (version[i] == '.') {
+ tsVersion |= ver & 0xFF;
+ tsVersion <<= 8;
+
+ ver = 0;
} else if (version[i] == 0) {
+ tsVersion |= ver & 0xFF;
+
break;
}
}
-
- tsVersion = 10 * tsVersion;
tsDnodeShellPort = tsServerPort + TSDB_PORT_DNODESHELL; // udp[6035-6039] tcp[6035]
tsDnodeDnodePort = tsServerPort + TSDB_PORT_DNODEDNODE; // udp/tcp
diff --git a/src/connector/nodejs/nodetaos/cinterface.js b/src/connector/nodejs/nodetaos/cinterface.js
index 656741ea16..b0908d2bd1 100644
--- a/src/connector/nodejs/nodetaos/cinterface.js
+++ b/src/connector/nodejs/nodetaos/cinterface.js
@@ -349,11 +349,12 @@ CTaosInterface.prototype.useResult = function useResult(result) {
return fields;
}
CTaosInterface.prototype.fetchBlock = function fetchBlock(result, fields) {
- let pblock = ref.ref(ref.ref(ref.NULL)); // equal to our raw data
- let num_of_rows = this.libtaos.taos_fetch_block(result, pblock)
- if (num_of_rows == 0) {
+ //let pblock = ref.ref(ref.ref(ref.NULL)); // equal to our raw data
+ let pblock = this.libtaos.taos_fetch_row(result);
+ if (pblock == null) {
return {block:null, num_of_rows:0};
}
+
var fieldL = this.libtaos.taos_fetch_lengths(result);
let isMicro = (this.libtaos.taos_result_precision(result) == FieldTypes.C_TIMESTAMP_MICRO);
@@ -361,7 +362,6 @@ CTaosInterface.prototype.fetchBlock = function fetchBlock(result, fields) {
var fieldlens = [];
if (ref.isNull(fieldL) == false) {
-
for (let i = 0; i < fields.length; i ++) {
let plen = ref.reinterpret(fieldL, 4, i*4);
let len = plen.readInt32LE(0);
diff --git a/src/dnode/inc/dnodeCfg.h b/src/dnode/inc/dnodeCfg.h
index d74303f325..896b3f574c 100644
--- a/src/dnode/inc/dnodeCfg.h
+++ b/src/dnode/inc/dnodeCfg.h
@@ -25,6 +25,7 @@ int32_t dnodeInitCfg();
void dnodeCleanupCfg();
void dnodeUpdateCfg(SDnodeCfg *cfg);
int32_t dnodeGetDnodeId();
+void dnodeGetClusterId(char *clusterId);
void dnodeGetCfg(int32_t *dnodeId, char *clusterId);
#ifdef __cplusplus
diff --git a/src/dnode/src/dnodeCfg.c b/src/dnode/src/dnodeCfg.c
index 89249d773b..f495dbe285 100644
--- a/src/dnode/src/dnodeCfg.c
+++ b/src/dnode/src/dnodeCfg.c
@@ -51,6 +51,12 @@ int32_t dnodeGetDnodeId() {
return dnodeId;
}
+void dnodeGetClusterId(char *clusterId) {
+ pthread_mutex_lock(&tsCfgMutex);
+ tstrncpy(clusterId, tsCfg.clusterId, TSDB_CLUSTER_ID_LEN);
+ pthread_mutex_unlock(&tsCfgMutex);
+}
+
void dnodeGetCfg(int32_t *dnodeId, char *clusterId) {
pthread_mutex_lock(&tsCfgMutex);
*dnodeId = tsCfg.dnodeId;
diff --git a/src/dnode/src/dnodeMRead.c b/src/dnode/src/dnodeMRead.c
index 0fc6400d99..9027c346f5 100644
--- a/src/dnode/src/dnodeMRead.c
+++ b/src/dnode/src/dnodeMRead.c
@@ -16,9 +16,7 @@
#define _DEFAULT_SOURCE
#include "os.h"
#include "tqueue.h"
-#include "twal.h"
#include "mnode.h"
-#include "dnodeVMgmt.h"
#include "dnodeMInfos.h"
#include "dnodeMRead.h"
diff --git a/src/dnode/src/dnodeMWrite.c b/src/dnode/src/dnodeMWrite.c
index 414b66653d..ea1cf028c5 100644
--- a/src/dnode/src/dnodeMWrite.c
+++ b/src/dnode/src/dnodeMWrite.c
@@ -18,7 +18,6 @@
#include "ttimer.h"
#include "tqueue.h"
#include "mnode.h"
-#include "dnodeVMgmt.h"
#include "dnodeMInfos.h"
#include "dnodeMWrite.h"
diff --git a/src/dnode/src/dnodeMain.c b/src/dnode/src/dnodeMain.c
index b5c4997337..517a9e9bc8 100644
--- a/src/dnode/src/dnodeMain.c
+++ b/src/dnode/src/dnodeMain.c
@@ -113,6 +113,7 @@ static void dnodeCleanupTmr() {
int32_t dnodeInitSystem() {
dnodeSetRunStatus(TSDB_RUN_STATUS_INITIALIZE);
tscEmbedded = 1;
+ taosIgnSIGPIPE();
taosBlockSIGPIPE();
taosResolveCRC();
taosInitGlobalCfg();
@@ -120,7 +121,6 @@ int32_t dnodeInitSystem() {
taosSetCoreDump();
taosInitNotes();
dnodeInitTmr();
- signal(SIGPIPE, SIG_IGN);
if (dnodeCreateDir(tsLogDir) < 0) {
printf("failed to create dir: %s, reason: %s\n", tsLogDir, strerror(errno));
diff --git a/src/dnode/src/dnodeVMgmt.c b/src/dnode/src/dnodeVMgmt.c
index 4753ebc400..7e3807d983 100644
--- a/src/dnode/src/dnodeVMgmt.c
+++ b/src/dnode/src/dnodeVMgmt.c
@@ -217,4 +217,4 @@ static int32_t dnodeProcessCreateMnodeMsg(SRpcMsg *pMsg) {
dnodeStartMnode(&pCfg->mnodes);
return TSDB_CODE_SUCCESS;
-}
\ No newline at end of file
+}
diff --git a/src/dnode/src/dnodeVRead.c b/src/dnode/src/dnodeVRead.c
index 3f31e49370..ea738661ce 100644
--- a/src/dnode/src/dnodeVRead.c
+++ b/src/dnode/src/dnodeVRead.c
@@ -54,6 +54,7 @@ void dnodeCleanupVRead() {
void dnodeDispatchToVReadQueue(SRpcMsg *pMsg) {
int32_t queuedMsgNum = 0;
int32_t leftLen = pMsg->contLen;
+ int32_t code = TSDB_CODE_VND_INVALID_VGROUP_ID;
char * pCont = pMsg->pCont;
while (leftLen > 0) {
@@ -64,7 +65,7 @@ void dnodeDispatchToVReadQueue(SRpcMsg *pMsg) {
assert(pHead->contLen > 0);
void *pVnode = vnodeAcquire(pHead->vgId);
if (pVnode != NULL) {
- int32_t code = vnodeWriteToRQueue(pVnode, pCont, pHead->contLen, TAOS_QTYPE_RPC, pMsg);
+ code = vnodeWriteToRQueue(pVnode, pCont, pHead->contLen, TAOS_QTYPE_RPC, pMsg);
if (code == TSDB_CODE_SUCCESS) queuedMsgNum++;
vnodeRelease(pVnode);
}
@@ -74,7 +75,7 @@ void dnodeDispatchToVReadQueue(SRpcMsg *pMsg) {
}
if (queuedMsgNum == 0) {
- SRpcMsg rpcRsp = {.handle = pMsg->handle, .code = TSDB_CODE_VND_INVALID_VGROUP_ID};
+ SRpcMsg rpcRsp = {.handle = pMsg->handle, .code = code};
rpcSendResponse(&rpcRsp);
}
diff --git a/src/dnode/src/dnodeVWrite.c b/src/dnode/src/dnodeVWrite.c
index a5ae8ac830..775ced0990 100644
--- a/src/dnode/src/dnodeVWrite.c
+++ b/src/dnode/src/dnodeVWrite.c
@@ -188,6 +188,7 @@ static void *dnodeProcessVWriteQueue(void *wparam) {
int32_t numOfMsgs;
int32_t qtype;
+ taosBlockSIGPIPE();
dDebug("dnode vwrite worker:%d is running", pWorker->workerId);
while (1) {
diff --git a/src/dnode/src/dnodeVnodes.c b/src/dnode/src/dnodeVnodes.c
index f6307b67d6..03b51feb9c 100644
--- a/src/dnode/src/dnodeVnodes.c
+++ b/src/dnode/src/dnodeVnodes.c
@@ -245,12 +245,11 @@ static void dnodeSendStatusMsg(void *handle, void *tmrId) {
pStatus->lastReboot = htonl(tsRebootTime);
pStatus->numOfCores = htons((uint16_t) tsNumOfCores);
pStatus->diskAvailable = tsAvailDataDirGB;
- pStatus->alternativeRole = (uint8_t) tsAlternativeRole;
+ pStatus->alternativeRole = tsAlternativeRole;
tstrncpy(pStatus->dnodeEp, tsLocalEp, TSDB_EP_LEN);
// fill cluster cfg parameters
pStatus->clusterCfg.numOfMnodes = htonl(tsNumOfMnodes);
- pStatus->clusterCfg.enableBalance = htonl(tsEnableBalance);
pStatus->clusterCfg.mnodeEqualVnodeNum = htonl(tsMnodeEqualVnodeNum);
pStatus->clusterCfg.offlineThreshold = htonl(tsOfflineThreshold);
pStatus->clusterCfg.statusInterval = htonl(tsStatusInterval);
@@ -262,7 +261,12 @@ static void dnodeSendStatusMsg(void *handle, void *tmrId) {
char timestr[32] = "1970-01-01 00:00:00.00";
(void)taosParseTime(timestr, &pStatus->clusterCfg.checkTime, strlen(timestr), TSDB_TIME_PRECISION_MILLI, 0);
tstrncpy(pStatus->clusterCfg.locale, tsLocale, TSDB_LOCALE_LEN);
- tstrncpy(pStatus->clusterCfg.charset, tsCharset, TSDB_LOCALE_LEN);
+ tstrncpy(pStatus->clusterCfg.charset, tsCharset, TSDB_LOCALE_LEN);
+
+ pStatus->clusterCfg.enableBalance = tsEnableBalance;
+ pStatus->clusterCfg.flowCtrl = tsEnableFlowCtrl;
+ pStatus->clusterCfg.slaveQuery = tsEnableSlaveQuery;
+ pStatus->clusterCfg.adjustMaster = tsEnableAdjustMaster;
vnodeBuildStatusMsg(pStatus);
contLen = sizeof(SStatusMsg) + pStatus->openVnodes * sizeof(SVnodeLoad);
diff --git a/src/inc/dnode.h b/src/inc/dnode.h
index dd41360e68..877738778b 100644
--- a/src/inc/dnode.h
+++ b/src/inc/dnode.h
@@ -36,6 +36,8 @@ bool dnodeIsMasterEp(char *ep);
void dnodeGetEpSetForPeer(SRpcEpSet *epSet);
void dnodeGetEpSetForShell(SRpcEpSet *epSet);
int32_t dnodeGetDnodeId();
+void dnodeGetClusterId(char *clusterId);
+
void dnodeUpdateEp(int32_t dnodeId, char *ep, char *fqdn, uint16_t *port);
bool dnodeCheckEpChanged(int32_t dnodeId, char *epstr);
bool dnodeStartMnode(SMInfos *pMinfos);
@@ -80,4 +82,4 @@ void dnodeReportStep(char *name, char *desc, int8_t finished);
}
#endif
-#endif
\ No newline at end of file
+#endif
diff --git a/src/inc/taosdef.h b/src/inc/taosdef.h
index 0cc06be1db..1ae37fa28a 100644
--- a/src/inc/taosdef.h
+++ b/src/inc/taosdef.h
@@ -369,6 +369,10 @@ void tsDataSwap(void *pLeft, void *pRight, int32_t type, int32_t size, void* buf
#define TSDB_MAX_DB_UPDATE 1
#define TSDB_DEFAULT_DB_UPDATE_OPTION 0
+#define TSDB_MIN_DB_CACHE_LAST_ROW 0
+#define TSDB_MAX_DB_CACHE_LAST_ROW 1
+#define TSDB_DEFAULT_CACHE_LAST_ROW 0
+
#define TSDB_MIN_FSYNC_PERIOD 0
#define TSDB_MAX_FSYNC_PERIOD 180000 // millisecond
#define TSDB_DEFAULT_FSYNC_PERIOD 3000 // three second
diff --git a/src/inc/taoserror.h b/src/inc/taoserror.h
index 7c7e7ec31a..69c01e6763 100644
--- a/src/inc/taoserror.h
+++ b/src/inc/taoserror.h
@@ -67,6 +67,7 @@ TAOS_DEFINE_ERROR(TSDB_CODE_RPC_INVALID_RESPONSE_TYPE, 0, 0x0012, "Invalid re
TAOS_DEFINE_ERROR(TSDB_CODE_RPC_INVALID_TIME_STAMP, 0, 0x0013, "Client and server's time is not synchronized")
TAOS_DEFINE_ERROR(TSDB_CODE_APP_NOT_READY, 0, 0x0014, "Database not ready")
TAOS_DEFINE_ERROR(TSDB_CODE_RPC_FQDN_ERROR, 0, 0x0015, "Unable to resolve FQDN")
+TAOS_DEFINE_ERROR(TSDB_CODE_RPC_INVALID_VERSION, 0, 0x0016, "Invalid app version")
//common & util
TAOS_DEFINE_ERROR(TSDB_CODE_COM_OPS_NOT_SUPPORT, 0, 0x0100, "Operation not supported")
diff --git a/src/inc/taosmsg.h b/src/inc/taosmsg.h
index 2df243eb3e..200fe2b0f9 100644
--- a/src/inc/taosmsg.h
+++ b/src/inc/taosmsg.h
@@ -324,6 +324,7 @@ typedef struct {
typedef struct {
char acctId[TSDB_ACCT_LEN];
char serverVersion[TSDB_VERSION_LEN];
+ char clusterId[TSDB_CLUSTER_ID_LEN];
int8_t writeAuth;
int8_t superAuth;
int8_t reserved1;
@@ -549,7 +550,8 @@ typedef struct {
int8_t quorum;
int8_t ignoreExist;
int8_t update;
- int8_t reserve[9];
+ int8_t cacheLastRow;
+ int8_t reserve[8];
} SCreateDbMsg, SAlterDbMsg;
typedef struct {
@@ -604,7 +606,6 @@ typedef struct {
typedef struct {
int32_t numOfMnodes; // tsNumOfMnodes
- int32_t enableBalance; // tsEnableBalance
int32_t mnodeEqualVnodeNum; // tsMnodeEqualVnodeNum
int32_t offlineThreshold; // tsOfflineThreshold
int32_t statusInterval; // tsStatusInterval
@@ -615,6 +616,11 @@ typedef struct {
int64_t checkTime; // 1970-01-01 00:00:00.000
char locale[TSDB_LOCALE_LEN]; // tsLocale
char charset[TSDB_LOCALE_LEN]; // tsCharset
+ int8_t enableBalance; // tsEnableBalance
+ int8_t flowCtrl;
+ int8_t slaveQuery;
+ int8_t adjustMaster;
+ int8_t reserved[4];
} SClusterCfg;
typedef struct {
@@ -661,8 +667,9 @@ typedef struct {
int8_t wals;
int8_t quorum;
int8_t update;
- int8_t reserved[11];
+ int8_t cacheLastRow;
int32_t vgCfgVersion;
+ int8_t reserved[10];
} SVnodeCfg;
typedef struct {
diff --git a/src/inc/tsdb.h b/src/inc/tsdb.h
index 04d6c78815..262bf30309 100644
--- a/src/inc/tsdb.h
+++ b/src/inc/tsdb.h
@@ -66,6 +66,7 @@ typedef struct {
int8_t precision;
int8_t compression;
int8_t update;
+ int8_t cacheLastRow;
} STsdbCfg;
// --------- TSDB REPOSITORY USAGE STATISTICS
@@ -119,7 +120,7 @@ STableCfg *tsdbCreateTableCfgFromMsg(SMDCreateTableMsg *pMsg);
int tsdbCreateTable(TSDB_REPO_T *repo, STableCfg *pCfg);
int tsdbDropTable(TSDB_REPO_T *pRepo, STableId tableId);
int tsdbUpdateTableTagValue(TSDB_REPO_T *repo, SUpdateTableTagValMsg *pMsg);
-TSKEY tsdbGetTableLastKey(TSDB_REPO_T *repo, uint64_t uid);
+// TSKEY tsdbGetTableLastKey(TSDB_REPO_T *repo, uint64_t uid);
uint32_t tsdbGetFileInfo(TSDB_REPO_T *repo, char *name, uint32_t *index, uint32_t eindex, int64_t *size);
diff --git a/src/inc/ttokendef.h b/src/inc/ttokendef.h
index 0a5a3d2fa4..7bd7b228cb 100644
--- a/src/inc/ttokendef.h
+++ b/src/inc/ttokendef.h
@@ -114,114 +114,115 @@
#define TK_COMP 96
#define TK_PRECISION 97
#define TK_UPDATE 98
-#define TK_LP 99
-#define TK_RP 100
-#define TK_TAGS 101
-#define TK_USING 102
-#define TK_AS 103
-#define TK_COMMA 104
-#define TK_NULL 105
-#define TK_SELECT 106
-#define TK_UNION 107
-#define TK_ALL 108
-#define TK_FROM 109
-#define TK_VARIABLE 110
-#define TK_INTERVAL 111
-#define TK_FILL 112
-#define TK_SLIDING 113
-#define TK_ORDER 114
-#define TK_BY 115
-#define TK_ASC 116
-#define TK_DESC 117
-#define TK_GROUP 118
-#define TK_HAVING 119
-#define TK_LIMIT 120
-#define TK_OFFSET 121
-#define TK_SLIMIT 122
-#define TK_SOFFSET 123
-#define TK_WHERE 124
-#define TK_NOW 125
-#define TK_RESET 126
-#define TK_QUERY 127
-#define TK_ADD 128
-#define TK_COLUMN 129
-#define TK_TAG 130
-#define TK_CHANGE 131
-#define TK_SET 132
-#define TK_KILL 133
-#define TK_CONNECTION 134
-#define TK_STREAM 135
-#define TK_COLON 136
-#define TK_ABORT 137
-#define TK_AFTER 138
-#define TK_ATTACH 139
-#define TK_BEFORE 140
-#define TK_BEGIN 141
-#define TK_CASCADE 142
-#define TK_CLUSTER 143
-#define TK_CONFLICT 144
-#define TK_COPY 145
-#define TK_DEFERRED 146
-#define TK_DELIMITERS 147
-#define TK_DETACH 148
-#define TK_EACH 149
-#define TK_END 150
-#define TK_EXPLAIN 151
-#define TK_FAIL 152
-#define TK_FOR 153
-#define TK_IGNORE 154
-#define TK_IMMEDIATE 155
-#define TK_INITIALLY 156
-#define TK_INSTEAD 157
-#define TK_MATCH 158
-#define TK_KEY 159
-#define TK_OF 160
-#define TK_RAISE 161
-#define TK_REPLACE 162
-#define TK_RESTRICT 163
-#define TK_ROW 164
-#define TK_STATEMENT 165
-#define TK_TRIGGER 166
-#define TK_VIEW 167
-#define TK_COUNT 168
-#define TK_SUM 169
-#define TK_AVG 170
-#define TK_MIN 171
-#define TK_MAX 172
-#define TK_FIRST 173
-#define TK_LAST 174
-#define TK_TOP 175
-#define TK_BOTTOM 176
-#define TK_STDDEV 177
-#define TK_PERCENTILE 178
-#define TK_APERCENTILE 179
-#define TK_LEASTSQUARES 180
-#define TK_HISTOGRAM 181
-#define TK_DIFF 182
-#define TK_SPREAD 183
-#define TK_TWA 184
-#define TK_INTERP 185
-#define TK_LAST_ROW 186
-#define TK_RATE 187
-#define TK_IRATE 188
-#define TK_SUM_RATE 189
-#define TK_SUM_IRATE 190
-#define TK_AVG_RATE 191
-#define TK_AVG_IRATE 192
-#define TK_TBID 193
-#define TK_SEMI 194
-#define TK_NONE 195
-#define TK_PREV 196
-#define TK_LINEAR 197
-#define TK_IMPORT 198
-#define TK_METRIC 199
-#define TK_TBNAME 200
-#define TK_JOIN 201
-#define TK_METRICS 202
-#define TK_STABLE 203
-#define TK_INSERT 204
-#define TK_INTO 205
-#define TK_VALUES 206
+#define TK_CACHELAST 99
+#define TK_LP 100
+#define TK_RP 101
+#define TK_TAGS 102
+#define TK_USING 103
+#define TK_AS 104
+#define TK_COMMA 105
+#define TK_NULL 106
+#define TK_SELECT 107
+#define TK_UNION 108
+#define TK_ALL 109
+#define TK_FROM 110
+#define TK_VARIABLE 111
+#define TK_INTERVAL 112
+#define TK_FILL 113
+#define TK_SLIDING 114
+#define TK_ORDER 115
+#define TK_BY 116
+#define TK_ASC 117
+#define TK_DESC 118
+#define TK_GROUP 119
+#define TK_HAVING 120
+#define TK_LIMIT 121
+#define TK_OFFSET 122
+#define TK_SLIMIT 123
+#define TK_SOFFSET 124
+#define TK_WHERE 125
+#define TK_NOW 126
+#define TK_RESET 127
+#define TK_QUERY 128
+#define TK_ADD 129
+#define TK_COLUMN 130
+#define TK_TAG 131
+#define TK_CHANGE 132
+#define TK_SET 133
+#define TK_KILL 134
+#define TK_CONNECTION 135
+#define TK_STREAM 136
+#define TK_COLON 137
+#define TK_ABORT 138
+#define TK_AFTER 139
+#define TK_ATTACH 140
+#define TK_BEFORE 141
+#define TK_BEGIN 142
+#define TK_CASCADE 143
+#define TK_CLUSTER 144
+#define TK_CONFLICT 145
+#define TK_COPY 146
+#define TK_DEFERRED 147
+#define TK_DELIMITERS 148
+#define TK_DETACH 149
+#define TK_EACH 150
+#define TK_END 151
+#define TK_EXPLAIN 152
+#define TK_FAIL 153
+#define TK_FOR 154
+#define TK_IGNORE 155
+#define TK_IMMEDIATE 156
+#define TK_INITIALLY 157
+#define TK_INSTEAD 158
+#define TK_MATCH 159
+#define TK_KEY 160
+#define TK_OF 161
+#define TK_RAISE 162
+#define TK_REPLACE 163
+#define TK_RESTRICT 164
+#define TK_ROW 165
+#define TK_STATEMENT 166
+#define TK_TRIGGER 167
+#define TK_VIEW 168
+#define TK_COUNT 169
+#define TK_SUM 170
+#define TK_AVG 171
+#define TK_MIN 172
+#define TK_MAX 173
+#define TK_FIRST 174
+#define TK_LAST 175
+#define TK_TOP 176
+#define TK_BOTTOM 177
+#define TK_STDDEV 178
+#define TK_PERCENTILE 179
+#define TK_APERCENTILE 180
+#define TK_LEASTSQUARES 181
+#define TK_HISTOGRAM 182
+#define TK_DIFF 183
+#define TK_SPREAD 184
+#define TK_TWA 185
+#define TK_INTERP 186
+#define TK_LAST_ROW 187
+#define TK_RATE 188
+#define TK_IRATE 189
+#define TK_SUM_RATE 190
+#define TK_SUM_IRATE 191
+#define TK_AVG_RATE 192
+#define TK_AVG_IRATE 193
+#define TK_TBID 194
+#define TK_SEMI 195
+#define TK_NONE 196
+#define TK_PREV 197
+#define TK_LINEAR 198
+#define TK_IMPORT 199
+#define TK_METRIC 200
+#define TK_TBNAME 201
+#define TK_JOIN 202
+#define TK_METRICS 203
+#define TK_STABLE 204
+#define TK_INSERT 205
+#define TK_INTO 206
+#define TK_VALUES 207
#define TK_SPACE 300
diff --git a/src/inc/ttype.h b/src/inc/ttype.h
index 3dd0c58ae2..7f6a8d65e7 100644
--- a/src/inc/ttype.h
+++ b/src/inc/ttype.h
@@ -28,7 +28,7 @@ extern "C" {
default: \
(_v) = (_finalType)GET_INT32_VAL(_data); \
break; \
- };
+ }
#ifdef __cplusplus
}
diff --git a/src/kit/shell/src/shellEngine.c b/src/kit/shell/src/shellEngine.c
index 627d06ac2e..fca0e93472 100644
--- a/src/kit/shell/src/shellEngine.c
+++ b/src/kit/shell/src/shellEngine.c
@@ -302,14 +302,12 @@ void shellRunCommandOnServer(TAOS *con, char command[]) {
st = taosGetTimestampUs();
- TAOS_RES* tmpSql = NULL;
- TAOS_RES* pSql = taos_query_h(con, command, &tmpSql);
+ TAOS_RES* pSql = taos_query_h(con, command, &result);
if (taos_errno(pSql)) {
taos_error(pSql, st);
return;
}
- atomic_store_64(&result, ((SSqlObj*)tmpSql)->self);
int64_t oresult = atomic_load_64(&result);
if (regex_match(command, "^\\s*use\\s+[a-zA-Z0-9_]+\\s*;\\s*$", REG_EXTENDED | REG_ICASE)) {
diff --git a/src/kit/taosdemo/taosdemo.c b/src/kit/taosdemo/taosdemo.c
index 53e7d23984..1d77a6bb63 100644
--- a/src/kit/taosdemo/taosdemo.c
+++ b/src/kit/taosdemo/taosdemo.c
@@ -95,7 +95,7 @@ typedef struct DemoArguments {
{0, 'P', "password", 0, "The password to use when connecting to the server. Default is 'taosdata'.", 3},
#endif
{0, 'd', "database", 0, "Destination database. Default is 'test'.", 3},
- {0, 'a', "replica", 0, "Set the replica parameters of the database, Default 1, min: 1, max: 3.", 3},
+ {0, 'a', "replica", 0, "Set the replica parameters of the database, Default 1, min: 1, max: 3.", 3},
{0, 'm', "table_prefix", 0, "Table prefix name. Default is 't'.", 3},
{0, 's', "sql file", 0, "The select sql file.", 3},
{0, 'M', 0, 0, "Use metric flag.", 13},
@@ -205,10 +205,10 @@ typedef struct DemoArguments {
arguments->tb_prefix = arg;
break;
case 'M':
- arguments->use_metric = false;
+ arguments->use_metric = true;
break;
case 'x':
- arguments->insert_only = false;
+ arguments->insert_only = true;
break;
case 'c':
if (wordexp(arg, &full_path, 0) != 0) {
@@ -406,9 +406,9 @@ typedef struct DemoArguments {
} else if (strcmp(argv[i], "-m") == 0) {
arguments->tb_prefix = argv[++i];
} else if (strcmp(argv[i], "-M") == 0) {
- arguments->use_metric = false;
+ arguments->use_metric = true;
} else if (strcmp(argv[i], "-x") == 0) {
- arguments->insert_only = false;
+ arguments->insert_only = true;
} else if (strcmp(argv[i], "-c") == 0) {
strcpy(configDir, argv[++i]);
} else if (strcmp(argv[i], "-O") == 0) {
@@ -476,6 +476,14 @@ typedef struct {
int notFinished;
tsem_t lock_sem;
int counter;
+
+ // insert delay statitics
+ int64_t cntDelay;
+ int64_t totalDelay;
+ int64_t avgDelay;
+ int64_t maxDelay;
+ int64_t minDelay;
+
} info;
typedef struct {
@@ -575,7 +583,7 @@ int main(int argc, char *argv[]) {
arguments.num_of_DPT = 100000;
arguments.num_of_RPR = 1000;
arguments.use_metric = true;
- arguments.insert_only = true;
+ arguments.insert_only = false;
// end change
parse_args(argc, argv, &arguments);
@@ -739,6 +747,9 @@ int main(int argc, char *argv[]) {
printf("Inserting data......\n");
pthread_t *pids = malloc(threads * sizeof(pthread_t));
info *infos = malloc(threads * sizeof(info));
+
+ memset(pids, 0, threads * sizeof(pthread_t));
+ memset(infos, 0, threads * sizeof(info));
int a = ntables / threads;
if (a < 1) {
@@ -768,6 +779,7 @@ int main(int argc, char *argv[]) {
t_info->end_table_id = i < b ? last + a : last + a - 1;
last = t_info->end_table_id + 1;
t_info->counter = 0;
+ t_info->minDelay = INT16_MAX;
tsem_init(&(t_info->mutex_sem), 0, 1);
t_info->notFinished = t_info->end_table_id - t_info->start_table_id + 1;
@@ -799,12 +811,29 @@ int main(int argc, char *argv[]) {
t, (int64_t)ntables * nrecords_per_table, nrecords_per_request,
(int64_t)ntables * nrecords_per_table / t);
+ int64_t totalDelay = 0;
+ int64_t maxDelay = 0;
+ int64_t minDelay = INT16_MAX;
+ int64_t cntDelay = 0;
+ double avgDelay = 0;
for (int i = 0; i < threads; i++) {
info *t_info = infos + i;
taos_close(t_info->taos);
tsem_destroy(&(t_info->mutex_sem));
tsem_destroy(&(t_info->lock_sem));
+
+ totalDelay += t_info->totalDelay;
+ cntDelay += t_info->cntDelay;
+ if (t_info->maxDelay > maxDelay) maxDelay = t_info->maxDelay;
+ if (t_info->minDelay < minDelay) minDelay = t_info->minDelay;
}
+ avgDelay = (double)totalDelay / cntDelay;
+
+ fprintf(fp, "insert delay, avg:%10.6fms, max: %10.6fms, min: %10.6fms\n\n",
+ avgDelay/1000.0, (double)maxDelay/1000.0, (double)minDelay/1000.0);
+
+ printf("insert delay, avg: %10.6fms, max: %10.6fms, min: %10.6fms\n\n",
+ avgDelay/1000.0, (double)maxDelay/1000.0, (double)minDelay/1000.0);
free(pids);
free(infos);
@@ -859,7 +888,7 @@ int main(int argc, char *argv[]) {
}
- if (!insert_only) {
+ if (false == insert_only) {
// query data
pthread_t read_id;
info *rInfo = malloc(sizeof(info));
@@ -998,7 +1027,7 @@ void * createTable(void *sarg)
/* Create all the tables; */
printf("Creating table from %d to %d\n", winfo->start_table_id, winfo->end_table_id);
for (int i = winfo->start_table_id; i <= winfo->end_table_id; i++) {
- snprintf(command, BUFFER_SIZE, "create table if not exists %s.%s%d (ts timestamp%s;", winfo->db_name, winfo->tb_prefix, i, winfo->cols);
+ snprintf(command, BUFFER_SIZE, "create table if not exists %s.%s%d (ts timestamp%s);", winfo->db_name, winfo->tb_prefix, i, winfo->cols);
queryDB(winfo->taos, command);
}
} else {
@@ -1204,6 +1233,41 @@ void *readMetric(void *sarg) {
return NULL;
}
+static int queryDbExec(TAOS *taos, char *command, int type) {
+ int i;
+ TAOS_RES *res = NULL;
+ int32_t code = -1;
+
+ for (i = 0; i < 5; i++) {
+ if (NULL != res) {
+ taos_free_result(res);
+ res = NULL;
+ }
+
+ res = taos_query(taos, command);
+ code = taos_errno(res);
+ if (0 == code) {
+ break;
+ }
+ }
+
+ if (code != 0) {
+ fprintf(stderr, "Failed to run %s, reason: %s\n", command, taos_errstr(res));
+ taos_free_result(res);
+ //taos_close(taos);
+ return -1;
+ }
+
+ if (1 == type) {
+ int affectedRows = taos_affected_rows(res);
+ taos_free_result(res);
+ return affectedRows;
+ }
+
+ taos_free_result(res);
+ return 0;
+}
+
void queryDB(TAOS *taos, char *command) {
int i;
TAOS_RES *pSql = NULL;
@@ -1273,7 +1337,21 @@ void *syncWrite(void *sarg) {
}
/* puts(buffer); */
- queryDB(winfo->taos, buffer);
+ int64_t startTs;
+ int64_t endTs;
+ startTs = taosGetTimestampUs();
+ //queryDB(winfo->taos, buffer);
+ int affectedRows = queryDbExec(winfo->taos, buffer, 1);
+
+ if (0 <= affectedRows){
+ endTs = taosGetTimestampUs();
+ int64_t delay = endTs - startTs;
+ if (delay > winfo->maxDelay) winfo->maxDelay = delay;
+ if (delay < winfo->minDelay) winfo->minDelay = delay;
+ winfo->cntDelay++;
+ winfo->totalDelay += delay;
+ //winfo->avgDelay = (double)winfo->totalDelay / winfo->cntDelay;
+ }
if (tID == winfo->end_table_id) {
i = inserted;
diff --git a/src/kit/taosdump/taosdump.c b/src/kit/taosdump/taosdump.c
index 588d21574b..60707f22e2 100644
--- a/src/kit/taosdump/taosdump.c
+++ b/src/kit/taosdump/taosdump.c
@@ -332,6 +332,9 @@ static error_t parse_opt(int key, char *arg, struct argp_state *state) {
break;
case 'N':
arguments->data_batch = atoi(arg);
+ if (arguments->data_batch >= INT16_MAX) {
+ arguments->data_batch = INT16_MAX - 1;
+ }
break;
case 'L':
{
diff --git a/src/mnode/inc/mnodeDef.h b/src/mnode/inc/mnodeDef.h
index 583acc19b4..59f9c30bf7 100644
--- a/src/mnode/inc/mnodeDef.h
+++ b/src/mnode/inc/mnodeDef.h
@@ -174,7 +174,8 @@ typedef struct {
int8_t replications;
int8_t quorum;
int8_t update;
- int8_t reserved[11];
+ int8_t cacheLastRow;
+ int8_t reserved[10];
} SDbCfg;
typedef struct SDbObj {
diff --git a/src/mnode/inc/mnodeDnode.h b/src/mnode/inc/mnodeDnode.h
index b959da73e8..56d7455ad2 100644
--- a/src/mnode/inc/mnodeDnode.h
+++ b/src/mnode/inc/mnodeDnode.h
@@ -52,6 +52,9 @@ typedef enum EDnodeOfflineReason {
TAOS_DN_OFF_TIME_ZONE_NOT_MATCH,
TAOS_DN_OFF_LOCALE_NOT_MATCH,
TAOS_DN_OFF_CHARSET_NOT_MATCH,
+ TAOS_DN_OFF_FLOW_CTRL_NOT_MATCH,
+ TAOS_DN_OFF_SLAVE_QUERY_NOT_MATCH,
+ TAOS_DN_OFF_ADJUST_MASTER_NOT_MATCH,
TAOS_DN_OFF_OTHERS
} EDnodeOfflineReason;
diff --git a/src/mnode/src/mnodeDb.c b/src/mnode/src/mnodeDb.c
index 0eb9828959..333844ccbe 100644
--- a/src/mnode/src/mnodeDb.c
+++ b/src/mnode/src/mnodeDb.c
@@ -322,6 +322,11 @@ static int32_t mnodeCheckDbCfg(SDbCfg *pCfg) {
return TSDB_CODE_MND_INVALID_DB_OPTION;
}
+ if (pCfg->cacheLastRow < TSDB_MIN_DB_CACHE_LAST_ROW || pCfg->cacheLastRow > TSDB_MAX_DB_CACHE_LAST_ROW) {
+ mError("invalid db option cacheLastRow:%d valid range: [%d, %d]", pCfg->cacheLastRow, TSDB_MIN_DB_CACHE_LAST_ROW, TSDB_MAX_DB_CACHE_LAST_ROW);
+ return TSDB_CODE_MND_INVALID_DB_OPTION;
+ }
+
return TSDB_CODE_SUCCESS;
}
@@ -343,6 +348,7 @@ static void mnodeSetDefaultDbCfg(SDbCfg *pCfg) {
if (pCfg->replications < 0) pCfg->replications = tsReplications;
if (pCfg->quorum < 0) pCfg->quorum = tsQuorum;
if (pCfg->update < 0) pCfg->update = tsUpdate;
+ if (pCfg->cacheLastRow < 0) pCfg->cacheLastRow = tsCacheLastRow;
}
static int32_t mnodeCreateDbCb(SMnodeMsg *pMsg, int32_t code) {
@@ -396,7 +402,8 @@ static int32_t mnodeCreateDb(SAcctObj *pAcct, SCreateDbMsg *pCreate, SMnodeMsg *
.walLevel = pCreate->walLevel,
.replications = pCreate->replications,
.quorum = pCreate->quorum,
- .update = pCreate->update
+ .update = pCreate->update,
+ .cacheLastRow = pCreate->cacheLastRow
};
mnodeSetDefaultDbCfg(&pDb->cfg);
@@ -605,6 +612,12 @@ static int32_t mnodeGetDbMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pConn
strcpy(pSchema[cols].name, "comp");
pSchema[cols].bytes = htons(pShow->bytes[cols]);
cols++;
+
+ pShow->bytes[cols] = 1;
+ pSchema[cols].type = TSDB_DATA_TYPE_TINYINT;
+ strcpy(pSchema[cols].name, "cachelast");
+ pSchema[cols].bytes = htons(pShow->bytes[cols]);
+ cols++;
#ifndef __CLOUD_VERSION__
}
#endif
@@ -750,6 +763,10 @@ static int32_t mnodeRetrieveDbs(SShowObj *pShow, char *data, int32_t rows, void
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
*(int8_t *)pWrite = pDb->cfg.compression;
cols++;
+
+ pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
+ *(int8_t *)pWrite = pDb->cfg.cacheLastRow;
+ cols++;
#ifndef __CLOUD_VERSION__
}
#endif
@@ -864,6 +881,7 @@ static SDbCfg mnodeGetAlterDbOption(SDbObj *pDb, SAlterDbMsg *pAlter) {
int8_t quorum = pAlter->quorum;
int8_t precision = pAlter->precision;
int8_t update = pAlter->update;
+ int8_t cacheLastRow = pAlter->cacheLastRow;
terrno = TSDB_CODE_SUCCESS;
@@ -976,6 +994,11 @@ static SDbCfg mnodeGetAlterDbOption(SDbObj *pDb, SAlterDbMsg *pAlter) {
#endif
}
+ if (cacheLastRow >= 0 && cacheLastRow != pDb->cfg.cacheLastRow) {
+ mDebug("db:%s, cacheLastRow:%d change to %d", pDb->name, pDb->cfg.cacheLastRow, cacheLastRow);
+ newCfg.cacheLastRow = cacheLastRow;
+ }
+
return newCfg;
}
diff --git a/src/mnode/src/mnodeDnode.c b/src/mnode/src/mnodeDnode.c
index 27588669eb..1ff2404834 100644
--- a/src/mnode/src/mnodeDnode.c
+++ b/src/mnode/src/mnodeDnode.c
@@ -375,10 +375,6 @@ static int32_t mnodeCheckClusterCfgPara(const SClusterCfg *clusterCfg) {
mError("\"numOfMnodes\"[%d - %d] cfg parameters inconsistent", clusterCfg->numOfMnodes, htonl(tsNumOfMnodes));
return TAOS_DN_OFF_NUM_OF_MNODES_NOT_MATCH;
}
- if (clusterCfg->enableBalance != htonl(tsEnableBalance)) {
- mError("\"balance\"[%d - %d] cfg parameters inconsistent", clusterCfg->enableBalance, htonl(tsEnableBalance));
- return TAOS_DN_OFF_ENABLE_BALANCE_NOT_MATCH;
- }
if (clusterCfg->mnodeEqualVnodeNum != htonl(tsMnodeEqualVnodeNum)) {
mError("\"mnodeEqualVnodeNum\"[%d - %d] cfg parameters inconsistent", clusterCfg->mnodeEqualVnodeNum,
htonl(tsMnodeEqualVnodeNum));
@@ -428,6 +424,23 @@ static int32_t mnodeCheckClusterCfgPara(const SClusterCfg *clusterCfg) {
return TAOS_DN_OFF_CHARSET_NOT_MATCH;
}
+ if (clusterCfg->enableBalance != tsEnableBalance) {
+ mError("\"balance\"[%d - %d] cfg parameters inconsistent", clusterCfg->enableBalance, tsEnableBalance);
+ return TAOS_DN_OFF_ENABLE_BALANCE_NOT_MATCH;
+ }
+ if (clusterCfg->flowCtrl != tsEnableFlowCtrl) {
+ mError("\"flowCtrl\"[%d - %d] cfg parameters inconsistent", clusterCfg->flowCtrl, tsEnableFlowCtrl);
+ return TAOS_DN_OFF_FLOW_CTRL_NOT_MATCH;
+ }
+ if (clusterCfg->slaveQuery != tsEnableSlaveQuery) {
+ mError("\"slaveQuery\"[%d - %d] cfg parameters inconsistent", clusterCfg->slaveQuery, tsEnableSlaveQuery);
+ return TAOS_DN_OFF_SLAVE_QUERY_NOT_MATCH;
+ }
+ if (clusterCfg->adjustMaster != tsEnableAdjustMaster) {
+ mError("\"adjustMaster\"[%d - %d] cfg parameters inconsistent", clusterCfg->adjustMaster, tsEnableAdjustMaster);
+ return TAOS_DN_OFF_ADJUST_MASTER_NOT_MATCH;
+ }
+
return 0;
}
@@ -1031,6 +1044,11 @@ static int32_t mnodeRetrieveConfigs(SShowObj *pShow, char *data, int32_t rows, v
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
switch (cfg->valType) {
+ case TAOS_CFG_VTYPE_INT8:
+ t = snprintf(varDataVal(pWrite), TSDB_CFG_VALUE_LEN, "%d", *((int8_t *)cfg->ptr));
+ varDataSetLen(pWrite, t);
+ numOfRows++;
+ break;
case TAOS_CFG_VTYPE_INT16:
t = snprintf(varDataVal(pWrite), TSDB_CFG_VALUE_LEN, "%d", *((int16_t *)cfg->ptr));
varDataSetLen(pWrite, t);
diff --git a/src/mnode/src/mnodeMnode.c b/src/mnode/src/mnodeMnode.c
index 8b3b2896ff..6549d58609 100644
--- a/src/mnode/src/mnodeMnode.c
+++ b/src/mnode/src/mnodeMnode.c
@@ -377,6 +377,24 @@ static int32_t mnodeCreateMnodeCb(SMnodeMsg *pMsg, int32_t code) {
return code;
}
+static bool mnodeAllOnline() {
+ void *pIter = NULL;
+ bool allOnline = true;
+
+ while (1) {
+ SMnodeObj *pMnode = NULL;
+ pIter = mnodeGetNextMnode(pIter, &pMnode);
+ if (pMnode == NULL) break;
+ if (pMnode->role != TAOS_SYNC_ROLE_MASTER && pMnode->role != TAOS_SYNC_ROLE_SLAVE) {
+ allOnline = false;
+ mnodeDecMnodeRef(pMnode);
+ }
+ }
+ mnodeCancelGetNextMnode(pIter);
+
+ return allOnline;
+}
+
void mnodeCreateMnode(int32_t dnodeId, char *dnodeEp, bool needConfirm) {
SMnodeObj *pMnode = calloc(1, sizeof(SMnodeObj));
pMnode->mnodeId = dnodeId;
@@ -389,6 +407,11 @@ void mnodeCreateMnode(int32_t dnodeId, char *dnodeEp, bool needConfirm) {
.fpRsp = mnodeCreateMnodeCb
};
+ if (needConfirm && !mnodeAllOnline()) {
+ mDebug("wait all mnode online then create new mnode");
+ return;
+ }
+
int32_t code = TSDB_CODE_SUCCESS;
if (needConfirm) {
code = mnodeSendCreateMnodeMsg(dnodeId, dnodeEp);
diff --git a/src/mnode/src/mnodeSdb.c b/src/mnode/src/mnodeSdb.c
index 1ab6a363e7..80a9978925 100644
--- a/src/mnode/src/mnodeSdb.c
+++ b/src/mnode/src/mnodeSdb.c
@@ -1081,6 +1081,8 @@ static void *sdbWorkerFp(void *pWorker) {
int32_t qtype;
void * unUsed;
+ taosBlockSIGPIPE();
+
while (1) {
int32_t numOfMsgs = taosReadAllQitemsFromQset(tsSdbWQset, tsSdbWQall, &unUsed);
if (numOfMsgs == 0) {
diff --git a/src/mnode/src/mnodeShow.c b/src/mnode/src/mnodeShow.c
index 3c1c92226a..6b9f0e26a7 100644
--- a/src/mnode/src/mnodeShow.c
+++ b/src/mnode/src/mnodeShow.c
@@ -351,6 +351,8 @@ static int32_t mnodeProcessConnectMsg(SMnodeMsg *pMsg) {
mnodeGetMnodeEpSetForShell(&pConnectRsp->epSet, false);
+ dnodeGetClusterId(pConnectRsp->clusterId);
+
connect_over:
if (code != TSDB_CODE_SUCCESS) {
if (pConnectRsp) rpcFreeCont(pConnectRsp);
diff --git a/src/mnode/src/mnodeVgroup.c b/src/mnode/src/mnodeVgroup.c
index 8e9bf97496..b0df98c950 100644
--- a/src/mnode/src/mnodeVgroup.c
+++ b/src/mnode/src/mnodeVgroup.c
@@ -659,7 +659,7 @@ static int32_t mnodeGetVgroupMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *p
pShow->bytes[cols] = 4;
pSchema[cols].type = TSDB_DATA_TYPE_INT;
- strcpy(pSchema[cols].name, "onlineVnodes");
+ strcpy(pSchema[cols].name, "onlines");
pSchema[cols].bytes = htons(pShow->bytes[cols]);
cols++;
@@ -674,13 +674,13 @@ static int32_t mnodeGetVgroupMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *p
for (int32_t i = 0; i < pShow->maxReplica; ++i) {
pShow->bytes[cols] = 2;
pSchema[cols].type = TSDB_DATA_TYPE_SMALLINT;
- snprintf(pSchema[cols].name, TSDB_COL_NAME_LEN, "v%dDnode", i + 1);
+ snprintf(pSchema[cols].name, TSDB_COL_NAME_LEN, "v%d_dnode", i + 1);
pSchema[cols].bytes = htons(pShow->bytes[cols]);
cols++;
pShow->bytes[cols] = 9 + VARSTR_HEADER_SIZE;
pSchema[cols].type = TSDB_DATA_TYPE_BINARY;
- snprintf(pSchema[cols].name, TSDB_COL_NAME_LEN, "v%dStatus", i + 1);
+ snprintf(pSchema[cols].name, TSDB_COL_NAME_LEN, "v%d_status", i + 1);
pSchema[cols].bytes = htons(pShow->bytes[cols]);
cols++;
}
@@ -863,6 +863,7 @@ static SCreateVnodeMsg *mnodeBuildVnodeMsg(SVgObj *pVgroup) {
pCfg->wals = 3;
pCfg->quorum = pDb->cfg.quorum;
pCfg->update = pDb->cfg.update;
+ pCfg->cacheLastRow = pDb->cfg.cacheLastRow;
SVnodeDesc *pNodes = pVnode->nodes;
for (int32_t j = 0; j < pVgroup->numOfVnodes; ++j) {
diff --git a/src/os/inc/osSocket.h b/src/os/inc/osSocket.h
index baf7687dd0..13d3fa4079 100644
--- a/src/os/inc/osSocket.h
+++ b/src/os/inc/osSocket.h
@@ -59,6 +59,7 @@ extern "C" {
// TAOS_OS_FUNC_SOCKET
int32_t taosSetNonblocking(SOCKET sock, int32_t on);
+void taosIgnSIGPIPE();
void taosBlockSIGPIPE();
// TAOS_OS_FUNC_SOCKET_SETSOCKETOPT
diff --git a/src/os/src/detail/osSocket.c b/src/os/src/detail/osSocket.c
index c7c9d77427..729471247f 100644
--- a/src/os/src/detail/osSocket.c
+++ b/src/os/src/detail/osSocket.c
@@ -39,6 +39,10 @@ int32_t taosSetNonblocking(SOCKET sock, int32_t on) {
return 0;
}
+void taosIgnSIGPIPE() {
+ signal(SIGPIPE, SIG_IGN);
+}
+
void taosBlockSIGPIPE() {
sigset_t signal_mask;
sigemptyset(&signal_mask);
diff --git a/src/os/src/windows/wSocket.c b/src/os/src/windows/wSocket.c
index 3b091b2699..9697c5e65f 100644
--- a/src/os/src/windows/wSocket.c
+++ b/src/os/src/windows/wSocket.c
@@ -46,6 +46,7 @@ int32_t taosSetNonblocking(SOCKET sock, int32_t on) {
return 0;
}
+void taosIgnSIGPIPE() {}
void taosBlockSIGPIPE() {}
int32_t taosSetSockOpt(SOCKET socketfd, int32_t level, int32_t optname, void *optval, int32_t optlen) {
diff --git a/src/query/inc/qExecutor.h b/src/query/inc/qExecutor.h
index d1278e2eee..201b3b2abc 100644
--- a/src/query/inc/qExecutor.h
+++ b/src/query/inc/qExecutor.h
@@ -33,13 +33,6 @@ struct SColumnFilterElem;
typedef bool (*__filter_func_t)(struct SColumnFilterElem* pFilter, char* val1, char* val2);
typedef int32_t (*__block_search_fn_t)(char* data, int32_t num, int64_t key, int32_t order);
-typedef struct SGroupResInfo {
- int32_t groupId;
- int32_t numOfDataPages;
- int32_t pageId;
- int32_t rowId;
-} SGroupResInfo;
-
typedef struct SResultRowPool {
int32_t elemSize;
int32_t blockSize;
@@ -72,6 +65,12 @@ typedef struct SResultRow {
union {STimeWindow win; char* key;}; // start key of current time window
} SResultRow;
+typedef struct SGroupResInfo {
+ int32_t rowId;
+ int32_t index;
+ SArray* pRows; // SArray
+} SGroupResInfo;
+
/**
* If the number of generated results is greater than this value,
* query query will be halt and return results to client immediate.
@@ -89,7 +88,6 @@ typedef struct SResultRowInfo {
int32_t size:24; // number of result set
int32_t capacity; // max capacity
int32_t curIndex; // current start active index
- int64_t startTime; // start time of the first time window for sliding query
int64_t prevSKey; // previous (not completed) sliding window start key
} SResultRowInfo;
diff --git a/src/query/inc/qHistogram.h b/src/query/inc/qHistogram.h
index 442e61750b..7742d151a0 100644
--- a/src/query/inc/qHistogram.h
+++ b/src/query/inc/qHistogram.h
@@ -67,7 +67,7 @@ void tHistogramDestroy(SHistogramInfo** pHisto);
void tHistogramPrint(SHistogramInfo* pHisto);
-int32_t vnodeHistobinarySearch(SHistBin* pEntry, int32_t len, double val);
+int32_t histoBinarySearch(SHistBin* pEntry, int32_t len, double val);
SHeapEntry* tHeapCreate(int32_t numOfEntries);
void tHeapSort(SHeapEntry* pEntry, int32_t len);
diff --git a/src/query/inc/qSqlparser.h b/src/query/inc/qSqlparser.h
index ee72500241..56e676ef16 100644
--- a/src/query/inc/qSqlparser.h
+++ b/src/query/inc/qSqlparser.h
@@ -120,7 +120,8 @@ typedef struct SCreateDBInfo {
int32_t compressionLevel;
SStrToken precision;
bool ignoreExists;
- int8_t update;
+ int8_t update;
+ int8_t cachelast;
SArray *keep;
} SCreateDBInfo;
diff --git a/src/query/inc/qUtil.h b/src/query/inc/qUtil.h
index dde2e39845..4620e3d61e 100644
--- a/src/query/inc/qUtil.h
+++ b/src/query/inc/qUtil.h
@@ -34,17 +34,13 @@ int32_t initResultRowInfo(SResultRowInfo* pResultRowInfo, int32_t size, int16_t
void cleanupResultRowInfo(SResultRowInfo* pResultRowInfo);
void resetResultRowInfo(SQueryRuntimeEnv* pRuntimeEnv, SResultRowInfo* pResultRowInfo);
-void popFrontResultRow(SQueryRuntimeEnv *pRuntimeEnv, SResultRowInfo *pResultRowInfo, int32_t num);
-void clearClosedResultRows(SQueryRuntimeEnv* pRuntimeEnv, SResultRowInfo *pResultRowInfo);
int32_t numOfClosedResultRows(SResultRowInfo* pResultRowInfo);
void closeAllResultRows(SResultRowInfo* pResultRowInfo);
-void removeRedundantResultRows(SResultRowInfo *pResultRowInfo, TSKEY lastKey, int32_t order);
int32_t initResultRow(SResultRow *pResultRow);
void closeResultRow(SResultRowInfo* pResultRowInfo, int32_t slot);
bool isResultRowClosed(SResultRowInfo *pResultRowInfo, int32_t slot);
void clearResultRow(SQueryRuntimeEnv* pRuntimeEnv, SResultRow* pResultRow, int16_t type);
-void copyResultRow(SQueryRuntimeEnv* pRuntimeEnv, SResultRow* dst, const SResultRow* src, int16_t type);
SResultRowCellInfo* getResultCell(SQueryRuntimeEnv* pRuntimeEnv, const SResultRow* pRow, int32_t index);
@@ -77,7 +73,6 @@ void* destroyResultRowPool(SResultRowPool* p);
int32_t getNumOfAllocatedResultRows(SResultRowPool* p);
int32_t getNumOfUsedResultRows(SResultRowPool* p);
-uint64_t getResultInfoUId(SQueryRuntimeEnv* pRuntimeEnv);
bool isPointInterpoQuery(SQuery *pQuery);
diff --git a/src/query/inc/queryLog.h b/src/query/inc/queryLog.h
index 825ff12538..d4e909d33a 100644
--- a/src/query/inc/queryLog.h
+++ b/src/query/inc/queryLog.h
@@ -22,8 +22,8 @@ extern "C" {
#include "tlog.h"
-extern uint32_t qDebugFlag;
-extern uint32_t tscEmbedded;
+extern int32_t qDebugFlag;
+extern int8_t tscEmbedded;
#define qFatal(...) do { if (qDebugFlag & DEBUG_FATAL) { taosPrintLog("QRY FATAL ", 255, __VA_ARGS__); }} while(0)
#define qError(...) do { if (qDebugFlag & DEBUG_ERROR) { taosPrintLog("QRY ERROR ", 255, __VA_ARGS__); }} while(0)
diff --git a/src/query/inc/sql.y b/src/query/inc/sql.y
index 0de6027006..dda15fb508 100644
--- a/src/query/inc/sql.y
+++ b/src/query/inc/sql.y
@@ -112,29 +112,29 @@ cmd ::= SHOW dbPrefix(X) STABLES. {
cmd ::= SHOW dbPrefix(X) STABLES LIKE ids(Y). {
SStrToken token;
- setDBName(&token, &X);
+ setDbName(&token, &X);
setShowOptions(pInfo, TSDB_MGMT_TABLE_METRIC, &token, &Y);
}
cmd ::= SHOW dbPrefix(X) VGROUPS. {
SStrToken token;
- setDBName(&token, &X);
+ setDbName(&token, &X);
setShowOptions(pInfo, TSDB_MGMT_TABLE_VGROUP, &token, 0);
}
cmd ::= SHOW dbPrefix(X) VGROUPS ids(Y). {
SStrToken token;
- setDBName(&token, &X);
+ setDbName(&token, &X);
setShowOptions(pInfo, TSDB_MGMT_TABLE_VGROUP, &token, &Y);
}
//drop configure for tables
cmd ::= DROP TABLE ifexists(Y) ids(X) cpxName(Z). {
X.n += Z.n;
- setDropDBTableInfo(pInfo, TSDB_SQL_DROP_TABLE, &X, &Y);
+ setDropDbTableInfo(pInfo, TSDB_SQL_DROP_TABLE, &X, &Y);
}
-cmd ::= DROP DATABASE ifexists(Y) ids(X). { setDropDBTableInfo(pInfo, TSDB_SQL_DROP_DB, &X, &Y); }
+cmd ::= DROP DATABASE ifexists(Y) ids(X). { setDropDbTableInfo(pInfo, TSDB_SQL_DROP_DB, &X, &Y); }
cmd ::= DROP DNODE ids(X). { setDCLSQLElems(pInfo, TSDB_SQL_DROP_DNODE, 1, &X); }
cmd ::= DROP USER ids(X). { setDCLSQLElems(pInfo, TSDB_SQL_DROP_USER, 1, &X); }
cmd ::= DROP ACCOUNT ids(X). { setDCLSQLElems(pInfo, TSDB_SQL_DROP_ACCT, 1, &X); }
@@ -149,16 +149,16 @@ cmd ::= DESCRIBE ids(X) cpxName(Y). {
}
/////////////////////////////////THE ALTER STATEMENT////////////////////////////////////////
-cmd ::= ALTER USER ids(X) PASS ids(Y). { setAlterUserSQL(pInfo, TSDB_ALTER_USER_PASSWD, &X, &Y, NULL); }
-cmd ::= ALTER USER ids(X) PRIVILEGE ids(Y). { setAlterUserSQL(pInfo, TSDB_ALTER_USER_PRIVILEGES, &X, NULL, &Y);}
+cmd ::= ALTER USER ids(X) PASS ids(Y). { setAlterUserSql(pInfo, TSDB_ALTER_USER_PASSWD, &X, &Y, NULL); }
+cmd ::= ALTER USER ids(X) PRIVILEGE ids(Y). { setAlterUserSql(pInfo, TSDB_ALTER_USER_PRIVILEGES, &X, NULL, &Y);}
cmd ::= ALTER DNODE ids(X) ids(Y). { setDCLSQLElems(pInfo, TSDB_SQL_CFG_DNODE, 2, &X, &Y); }
cmd ::= ALTER DNODE ids(X) ids(Y) ids(Z). { setDCLSQLElems(pInfo, TSDB_SQL_CFG_DNODE, 3, &X, &Y, &Z); }
cmd ::= ALTER LOCAL ids(X). { setDCLSQLElems(pInfo, TSDB_SQL_CFG_LOCAL, 1, &X); }
cmd ::= ALTER LOCAL ids(X) ids(Y). { setDCLSQLElems(pInfo, TSDB_SQL_CFG_LOCAL, 2, &X, &Y); }
cmd ::= ALTER DATABASE ids(X) alter_db_optr(Y). { SStrToken t = {0}; setCreateDBSQL(pInfo, TSDB_SQL_ALTER_DB, &X, &Y, &t);}
-cmd ::= ALTER ACCOUNT ids(X) acct_optr(Z). { setCreateAcctSQL(pInfo, TSDB_SQL_ALTER_ACCT, &X, NULL, &Z);}
-cmd ::= ALTER ACCOUNT ids(X) PASS ids(Y) acct_optr(Z). { setCreateAcctSQL(pInfo, TSDB_SQL_ALTER_ACCT, &X, &Y, &Z);}
+cmd ::= ALTER ACCOUNT ids(X) acct_optr(Z). { setCreateAcctSql(pInfo, TSDB_SQL_ALTER_ACCT, &X, NULL, &Z);}
+cmd ::= ALTER ACCOUNT ids(X) PASS ids(Y) acct_optr(Z). { setCreateAcctSql(pInfo, TSDB_SQL_ALTER_ACCT, &X, &Y, &Z);}
// An IDENTIFIER can be a generic identifier, or one of several keywords.
// Any non-standard keyword can also be an identifier.
@@ -179,9 +179,9 @@ ifnotexists(X) ::= . { X.n = 0;}
//create option for dnode/db/user/account
cmd ::= CREATE DNODE ids(X). { setDCLSQLElems(pInfo, TSDB_SQL_CREATE_DNODE, 1, &X);}
cmd ::= CREATE ACCOUNT ids(X) PASS ids(Y) acct_optr(Z).
- { setCreateAcctSQL(pInfo, TSDB_SQL_CREATE_ACCT, &X, &Y, &Z);}
+ { setCreateAcctSql(pInfo, TSDB_SQL_CREATE_ACCT, &X, &Y, &Z);}
cmd ::= CREATE DATABASE ifnotexists(Z) ids(X) db_optr(Y). { setCreateDBSQL(pInfo, TSDB_SQL_CREATE_DB, &X, &Y, &Z);}
-cmd ::= CREATE USER ids(X) PASS ids(Y). { setCreateUserSQL(pInfo, &X, &Y);}
+cmd ::= CREATE USER ids(X) PASS ids(Y). { setCreateUserSql(pInfo, &X, &Y);}
pps(Y) ::= . { Y.n = 0; }
pps(Y) ::= PPS INTEGER(X). { Y = X; }
@@ -240,6 +240,7 @@ fsync(Y) ::= FSYNC INTEGER(X). { Y = X; }
comp(Y) ::= COMP INTEGER(X). { Y = X; }
prec(Y) ::= PRECISION STRING(X). { Y = X; }
update(Y) ::= UPDATE INTEGER(X). { Y = X; }
+cachelast(Y) ::= CACHELAST INTEGER(X). { Y = X; }
%type db_optr {SCreateDBInfo}
db_optr(Y) ::= . {setDefaultCreateDbOption(&Y);}
@@ -258,6 +259,7 @@ db_optr(Y) ::= db_optr(Z) comp(X). { Y = Z; Y.compressionLevel = strto
db_optr(Y) ::= db_optr(Z) prec(X). { Y = Z; Y.precision = X; }
db_optr(Y) ::= db_optr(Z) keep(X). { Y = Z; Y.keep = X; }
db_optr(Y) ::= db_optr(Z) update(X). { Y = Z; Y.update = strtol(X.z, NULL, 10); }
+db_optr(Y) ::= db_optr(Z) cachelast(X). { Y = Z; Y.cachelast = strtol(X.z, NULL, 10); }
%type alter_db_optr {SCreateDBInfo}
alter_db_optr(Y) ::= . { setDefaultCreateDbOption(&Y);}
@@ -270,21 +272,22 @@ alter_db_optr(Y) ::= alter_db_optr(Z) comp(X). { Y = Z; Y.compressionLeve
alter_db_optr(Y) ::= alter_db_optr(Z) wal(X). { Y = Z; Y.walLevel = strtol(X.z, NULL, 10); }
alter_db_optr(Y) ::= alter_db_optr(Z) fsync(X). { Y = Z; Y.fsyncPeriod = strtol(X.z, NULL, 10); }
alter_db_optr(Y) ::= alter_db_optr(Z) update(X). { Y = Z; Y.update = strtol(X.z, NULL, 10); }
+alter_db_optr(Y) ::= alter_db_optr(Z) cachelast(X). { Y = Z; Y.cachelast = strtol(X.z, NULL, 10); }
%type typename {TAOS_FIELD}
typename(A) ::= ids(X). {
X.type = 0;
- tSQLSetColumnType (&A, &X);
+ tSqlSetColumnType (&A, &X);
}
//define binary type, e.g., binary(10), nchar(10)
typename(A) ::= ids(X) LP signed(Y) RP. {
if (Y <= 0) {
X.type = 0;
- tSQLSetColumnType(&A, &X);
+ tSqlSetColumnType(&A, &X);
} else {
X.type = -Y; // negative value of name length
- tSQLSetColumnType(&A, &X);
+ tSqlSetColumnType(&A, &X);
}
}
@@ -315,8 +318,8 @@ create_table_list(A) ::= create_table_list(X) create_from_stable(Z). {
%type create_table_args{SCreateTableSQL*}
create_table_args(A) ::= ifnotexists(U) ids(V) cpxName(Z) LP columnlist(X) RP. {
- A = tSetCreateSQLElems(X, NULL, NULL, TSQL_CREATE_TABLE);
- setSQLInfo(pInfo, A, NULL, TSDB_SQL_CREATE_TABLE);
+ A = tSetCreateSqlElems(X, NULL, NULL, TSQL_CREATE_TABLE);
+ setSqlInfo(pInfo, A, NULL, TSDB_SQL_CREATE_TABLE);
V.n += Z.n;
setCreatedTableName(pInfo, &V, &U);
@@ -324,8 +327,8 @@ create_table_args(A) ::= ifnotexists(U) ids(V) cpxName(Z) LP columnlist(X) RP. {
// create super table
create_table_args(A) ::= ifnotexists(U) ids(V) cpxName(Z) LP columnlist(X) RP TAGS LP columnlist(Y) RP. {
- A = tSetCreateSQLElems(X, Y, NULL, TSQL_CREATE_STABLE);
- setSQLInfo(pInfo, A, NULL, TSDB_SQL_CREATE_TABLE);
+ A = tSetCreateSqlElems(X, Y, NULL, TSQL_CREATE_STABLE);
+ setSqlInfo(pInfo, A, NULL, TSDB_SQL_CREATE_TABLE);
V.n += Z.n;
setCreatedTableName(pInfo, &V, &U);
@@ -343,8 +346,8 @@ create_from_stable(A) ::= ifnotexists(U) ids(V) cpxName(Z) USING ids(X) cpxName(
// create stream
// create table table_name as select count(*) from super_table_name interval(time)
create_table_args(A) ::= ifnotexists(U) ids(V) cpxName(Z) AS select(S). {
- A = tSetCreateSQLElems(NULL, NULL, S, TSQL_CREATE_STREAM);
- setSQLInfo(pInfo, A, NULL, TSDB_SQL_CREATE_TABLE);
+ A = tSetCreateSqlElems(NULL, NULL, S, TSQL_CREATE_STREAM);
+ setSqlInfo(pInfo, A, NULL, TSDB_SQL_CREATE_TABLE);
V.n += Z.n;
setCreatedTableName(pInfo, &V, &U);
@@ -359,7 +362,7 @@ columnlist(A) ::= column(X). {A = taosArrayInit(4, sizeof(T
// The information used for a column is the name and type of column:
// tinyint smallint int bigint float double bool timestamp binary(x) nchar(x)
column(A) ::= ids(X) typename(Y). {
- tSQLSetColumnInfo(&A, &X, &Y);
+ tSqlSetColumnInfo(&A, &X, &Y);
}
%type tagitemlist {SArray*}
@@ -407,7 +410,7 @@ tagitem(A) ::= PLUS(X) FLOAT(Y). {
%type select {SQuerySQL*}
%destructor select {doDestroyQuerySql($$);}
select(A) ::= SELECT(T) selcollist(W) from(X) where_opt(Y) interval_opt(K) fill_opt(F) sliding_opt(S) groupby_opt(P) orderby_opt(Z) having_opt(N) slimit_opt(G) limit_opt(L). {
- A = tSetQuerySQLElems(&T, W, X, Y, P, Z, &K, &S, F, &L, &G);
+ A = tSetQuerySqlElems(&T, W, X, Y, P, Z, &K, &S, F, &L, &G);
}
%type union {SSubclauseInfo*}
@@ -418,33 +421,33 @@ union(Y) ::= LP union(X) RP. { Y = X; }
union(Y) ::= union(Z) UNION ALL select(X). { Y = appendSelectClause(Z, X); }
union(Y) ::= union(Z) UNION ALL LP select(X) RP. { Y = appendSelectClause(Z, X); }
-cmd ::= union(X). { setSQLInfo(pInfo, X, NULL, TSDB_SQL_SELECT); }
+cmd ::= union(X). { setSqlInfo(pInfo, X, NULL, TSDB_SQL_SELECT); }
// Support for the SQL exprssion without from & where subclauses, e.g.,
// select current_database(),
// select server_version(), select client_version(),
// select server_state();
select(A) ::= SELECT(T) selcollist(W). {
- A = tSetQuerySQLElems(&T, W, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+ A = tSetQuerySqlElems(&T, W, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
}
// selcollist is a list of expressions that are to become the return
// values of the SELECT statement. The "*" in statements like
// "SELECT * FROM ..." is encoded as a special expression with an opcode of TK_ALL.
%type selcollist {tSQLExprList*}
-%destructor selcollist {tSQLExprListDestroy($$);}
+%destructor selcollist {tSqlExprListDestroy($$);}
%type sclp {tSQLExprList*}
-%destructor sclp {tSQLExprListDestroy($$);}
+%destructor sclp {tSqlExprListDestroy($$);}
sclp(A) ::= selcollist(X) COMMA. {A = X;}
sclp(A) ::= . {A = 0;}
selcollist(A) ::= sclp(P) expr(X) as(Y). {
- A = tSQLExprListAppend(P, X, Y.n?&Y:0);
+ A = tSqlExprListAppend(P, X, Y.n?&Y:0);
}
selcollist(A) ::= sclp(P) STAR. {
- tSQLExpr *pNode = tSQLExprIdValueCreate(NULL, TK_ALL);
- A = tSQLExprListAppend(P, pNode, 0);
+ tSQLExpr *pNode = tSqlExprIdValueCreate(NULL, TK_ALL);
+ A = tSqlExprListAppend(P, pNode, 0);
}
// An option "AS " phrase that can follow one of the expressions that
@@ -573,7 +576,7 @@ grouplist(A) ::= item(X). {
//having clause, ignore the input condition in having
%type having_opt {tSQLExpr*}
-%destructor having_opt {tSQLExprDestroy($$);}
+%destructor having_opt {tSqlExprDestroy($$);}
having_opt(A) ::=. {A = 0;}
having_opt(A) ::= HAVING expr(X). {A = X;}
@@ -595,7 +598,7 @@ slimit_opt(A) ::= SLIMIT signed(X) COMMA signed(Y).
{A.limit = Y; A.offset = X;}
%type where_opt {tSQLExpr*}
-%destructor where_opt {tSQLExprDestroy($$);}
+%destructor where_opt {tSqlExprDestroy($$);}
where_opt(A) ::= . {A = 0;}
where_opt(A) ::= WHERE expr(X). {A = X;}
@@ -603,67 +606,67 @@ where_opt(A) ::= WHERE expr(X). {A = X;}
/////////////////////////// Expression Processing /////////////////////////////
//
%type expr {tSQLExpr*}
-%destructor expr {tSQLExprDestroy($$);}
+%destructor expr {tSqlExprDestroy($$);}
expr(A) ::= LP(X) expr(Y) RP(Z). {A = Y; A->token.z = X.z; A->token.n = (Z.z - X.z + 1);}
-expr(A) ::= ID(X). { A = tSQLExprIdValueCreate(&X, TK_ID);}
-expr(A) ::= ID(X) DOT ID(Y). { X.n += (1+Y.n); A = tSQLExprIdValueCreate(&X, TK_ID);}
-expr(A) ::= ID(X) DOT STAR(Y). { X.n += (1+Y.n); A = tSQLExprIdValueCreate(&X, TK_ALL);}
+expr(A) ::= ID(X). { A = tSqlExprIdValueCreate(&X, TK_ID);}
+expr(A) ::= ID(X) DOT ID(Y). { X.n += (1+Y.n); A = tSqlExprIdValueCreate(&X, TK_ID);}
+expr(A) ::= ID(X) DOT STAR(Y). { X.n += (1+Y.n); A = tSqlExprIdValueCreate(&X, TK_ALL);}
-expr(A) ::= INTEGER(X). { A = tSQLExprIdValueCreate(&X, TK_INTEGER);}
-expr(A) ::= MINUS(X) INTEGER(Y). { X.n += Y.n; X.type = TK_INTEGER; A = tSQLExprIdValueCreate(&X, TK_INTEGER);}
-expr(A) ::= PLUS(X) INTEGER(Y). { X.n += Y.n; X.type = TK_INTEGER; A = tSQLExprIdValueCreate(&X, TK_INTEGER);}
-expr(A) ::= FLOAT(X). { A = tSQLExprIdValueCreate(&X, TK_FLOAT);}
-expr(A) ::= MINUS(X) FLOAT(Y). { X.n += Y.n; X.type = TK_FLOAT; A = tSQLExprIdValueCreate(&X, TK_FLOAT);}
-expr(A) ::= PLUS(X) FLOAT(Y). { X.n += Y.n; X.type = TK_FLOAT; A = tSQLExprIdValueCreate(&X, TK_FLOAT);}
-expr(A) ::= STRING(X). { A = tSQLExprIdValueCreate(&X, TK_STRING);}
-expr(A) ::= NOW(X). { A = tSQLExprIdValueCreate(&X, TK_NOW); }
-expr(A) ::= VARIABLE(X). { A = tSQLExprIdValueCreate(&X, TK_VARIABLE);}
-expr(A) ::= BOOL(X). { A = tSQLExprIdValueCreate(&X, TK_BOOL);}
+expr(A) ::= INTEGER(X). { A = tSqlExprIdValueCreate(&X, TK_INTEGER);}
+expr(A) ::= MINUS(X) INTEGER(Y). { X.n += Y.n; X.type = TK_INTEGER; A = tSqlExprIdValueCreate(&X, TK_INTEGER);}
+expr(A) ::= PLUS(X) INTEGER(Y). { X.n += Y.n; X.type = TK_INTEGER; A = tSqlExprIdValueCreate(&X, TK_INTEGER);}
+expr(A) ::= FLOAT(X). { A = tSqlExprIdValueCreate(&X, TK_FLOAT);}
+expr(A) ::= MINUS(X) FLOAT(Y). { X.n += Y.n; X.type = TK_FLOAT; A = tSqlExprIdValueCreate(&X, TK_FLOAT);}
+expr(A) ::= PLUS(X) FLOAT(Y). { X.n += Y.n; X.type = TK_FLOAT; A = tSqlExprIdValueCreate(&X, TK_FLOAT);}
+expr(A) ::= STRING(X). { A = tSqlExprIdValueCreate(&X, TK_STRING);}
+expr(A) ::= NOW(X). { A = tSqlExprIdValueCreate(&X, TK_NOW); }
+expr(A) ::= VARIABLE(X). { A = tSqlExprIdValueCreate(&X, TK_VARIABLE);}
+expr(A) ::= BOOL(X). { A = tSqlExprIdValueCreate(&X, TK_BOOL);}
// ordinary functions: min(x), max(x), top(k, 20)
-expr(A) ::= ID(X) LP exprlist(Y) RP(E). { A = tSQLExprCreateFunction(Y, &X, &E, X.type); }
+expr(A) ::= ID(X) LP exprlist(Y) RP(E). { A = tSqlExprCreateFunction(Y, &X, &E, X.type); }
// for parsing sql functions with wildcard for parameters. e.g., count(*)/first(*)/last(*) operation
-expr(A) ::= ID(X) LP STAR RP(Y). { A = tSQLExprCreateFunction(NULL, &X, &Y, X.type); }
+expr(A) ::= ID(X) LP STAR RP(Y). { A = tSqlExprCreateFunction(NULL, &X, &Y, X.type); }
// is (not) null expression
-expr(A) ::= expr(X) IS NULL. {A = tSQLExprCreate(X, NULL, TK_ISNULL);}
-expr(A) ::= expr(X) IS NOT NULL. {A = tSQLExprCreate(X, NULL, TK_NOTNULL);}
+expr(A) ::= expr(X) IS NULL. {A = tSqlExprCreate(X, NULL, TK_ISNULL);}
+expr(A) ::= expr(X) IS NOT NULL. {A = tSqlExprCreate(X, NULL, TK_NOTNULL);}
// relational expression
-expr(A) ::= expr(X) LT expr(Y). {A = tSQLExprCreate(X, Y, TK_LT);}
-expr(A) ::= expr(X) GT expr(Y). {A = tSQLExprCreate(X, Y, TK_GT);}
-expr(A) ::= expr(X) LE expr(Y). {A = tSQLExprCreate(X, Y, TK_LE);}
-expr(A) ::= expr(X) GE expr(Y). {A = tSQLExprCreate(X, Y, TK_GE);}
-expr(A) ::= expr(X) NE expr(Y). {A = tSQLExprCreate(X, Y, TK_NE);}
-expr(A) ::= expr(X) EQ expr(Y). {A = tSQLExprCreate(X, Y, TK_EQ);}
+expr(A) ::= expr(X) LT expr(Y). {A = tSqlExprCreate(X, Y, TK_LT);}
+expr(A) ::= expr(X) GT expr(Y). {A = tSqlExprCreate(X, Y, TK_GT);}
+expr(A) ::= expr(X) LE expr(Y). {A = tSqlExprCreate(X, Y, TK_LE);}
+expr(A) ::= expr(X) GE expr(Y). {A = tSqlExprCreate(X, Y, TK_GE);}
+expr(A) ::= expr(X) NE expr(Y). {A = tSqlExprCreate(X, Y, TK_NE);}
+expr(A) ::= expr(X) EQ expr(Y). {A = tSqlExprCreate(X, Y, TK_EQ);}
-expr(A) ::= expr(X) AND expr(Y). {A = tSQLExprCreate(X, Y, TK_AND);}
-expr(A) ::= expr(X) OR expr(Y). {A = tSQLExprCreate(X, Y, TK_OR); }
+expr(A) ::= expr(X) AND expr(Y). {A = tSqlExprCreate(X, Y, TK_AND);}
+expr(A) ::= expr(X) OR expr(Y). {A = tSqlExprCreate(X, Y, TK_OR); }
// binary arithmetic expression
-expr(A) ::= expr(X) PLUS expr(Y). {A = tSQLExprCreate(X, Y, TK_PLUS); }
-expr(A) ::= expr(X) MINUS expr(Y). {A = tSQLExprCreate(X, Y, TK_MINUS); }
-expr(A) ::= expr(X) STAR expr(Y). {A = tSQLExprCreate(X, Y, TK_STAR); }
-expr(A) ::= expr(X) SLASH expr(Y). {A = tSQLExprCreate(X, Y, TK_DIVIDE);}
-expr(A) ::= expr(X) REM expr(Y). {A = tSQLExprCreate(X, Y, TK_REM); }
+expr(A) ::= expr(X) PLUS expr(Y). {A = tSqlExprCreate(X, Y, TK_PLUS); }
+expr(A) ::= expr(X) MINUS expr(Y). {A = tSqlExprCreate(X, Y, TK_MINUS); }
+expr(A) ::= expr(X) STAR expr(Y). {A = tSqlExprCreate(X, Y, TK_STAR); }
+expr(A) ::= expr(X) SLASH expr(Y). {A = tSqlExprCreate(X, Y, TK_DIVIDE);}
+expr(A) ::= expr(X) REM expr(Y). {A = tSqlExprCreate(X, Y, TK_REM); }
// like expression
-expr(A) ::= expr(X) LIKE expr(Y). {A = tSQLExprCreate(X, Y, TK_LIKE); }
+expr(A) ::= expr(X) LIKE expr(Y). {A = tSqlExprCreate(X, Y, TK_LIKE); }
//in expression
-expr(A) ::= expr(X) IN LP exprlist(Y) RP. {A = tSQLExprCreate(X, (tSQLExpr*)Y, TK_IN); }
+expr(A) ::= expr(X) IN LP exprlist(Y) RP. {A = tSqlExprCreate(X, (tSQLExpr*)Y, TK_IN); }
%type exprlist {tSQLExprList*}
-%destructor exprlist {tSQLExprListDestroy($$);}
+%destructor exprlist {tSqlExprListDestroy($$);}
%type expritem {tSQLExpr*}
-%destructor expritem {tSQLExprDestroy($$);}
+%destructor expritem {tSqlExprDestroy($$);}
-exprlist(A) ::= exprlist(X) COMMA expritem(Y). {A = tSQLExprListAppend(X,Y,0);}
-exprlist(A) ::= expritem(X). {A = tSQLExprListAppend(0,X,0);}
+exprlist(A) ::= exprlist(X) COMMA expritem(Y). {A = tSqlExprListAppend(X,Y,0);}
+exprlist(A) ::= expritem(X). {A = tSqlExprListAppend(0,X,0);}
expritem(A) ::= expr(X). {A = X;}
expritem(A) ::= . {A = 0;}
@@ -673,8 +676,8 @@ cmd ::= RESET QUERY CACHE. { setDCLSQLElems(pInfo, TSDB_SQL_RESET_CACHE, 0);}
///////////////////////////////////ALTER TABLE statement//////////////////////////////////
cmd ::= ALTER TABLE ids(X) cpxName(F) ADD COLUMN columnlist(A). {
X.n += F.n;
- SAlterTableSQL* pAlterTable = tAlterTableSQLElems(&X, A, NULL, TSDB_ALTER_TABLE_ADD_COLUMN);
- setSQLInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
+ SAlterTableSQL* pAlterTable = tAlterTableSqlElems(&X, A, NULL, TSDB_ALTER_TABLE_ADD_COLUMN);
+ setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
}
cmd ::= ALTER TABLE ids(X) cpxName(F) DROP COLUMN ids(A). {
@@ -683,15 +686,15 @@ cmd ::= ALTER TABLE ids(X) cpxName(F) DROP COLUMN ids(A). {
toTSDBType(A.type);
SArray* K = tVariantListAppendToken(NULL, &A, -1);
- SAlterTableSQL* pAlterTable = tAlterTableSQLElems(&X, NULL, K, TSDB_ALTER_TABLE_DROP_COLUMN);
- setSQLInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
+ SAlterTableSQL* pAlterTable = tAlterTableSqlElems(&X, NULL, K, TSDB_ALTER_TABLE_DROP_COLUMN);
+ setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
}
//////////////////////////////////ALTER TAGS statement/////////////////////////////////////
cmd ::= ALTER TABLE ids(X) cpxName(Y) ADD TAG columnlist(A). {
X.n += Y.n;
- SAlterTableSQL* pAlterTable = tAlterTableSQLElems(&X, A, NULL, TSDB_ALTER_TABLE_ADD_TAG_COLUMN);
- setSQLInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
+ SAlterTableSQL* pAlterTable = tAlterTableSqlElems(&X, A, NULL, TSDB_ALTER_TABLE_ADD_TAG_COLUMN);
+ setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
}
cmd ::= ALTER TABLE ids(X) cpxName(Z) DROP TAG ids(Y). {
X.n += Z.n;
@@ -699,8 +702,8 @@ cmd ::= ALTER TABLE ids(X) cpxName(Z) DROP TAG ids(Y). {
toTSDBType(Y.type);
SArray* A = tVariantListAppendToken(NULL, &Y, -1);
- SAlterTableSQL* pAlterTable = tAlterTableSQLElems(&X, NULL, A, TSDB_ALTER_TABLE_DROP_TAG_COLUMN);
- setSQLInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
+ SAlterTableSQL* pAlterTable = tAlterTableSqlElems(&X, NULL, A, TSDB_ALTER_TABLE_DROP_TAG_COLUMN);
+ setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
}
cmd ::= ALTER TABLE ids(X) cpxName(F) CHANGE TAG ids(Y) ids(Z). {
@@ -712,8 +715,8 @@ cmd ::= ALTER TABLE ids(X) cpxName(F) CHANGE TAG ids(Y) ids(Z). {
toTSDBType(Z.type);
A = tVariantListAppendToken(A, &Z, -1);
- SAlterTableSQL* pAlterTable = tAlterTableSQLElems(&X, NULL, A, TSDB_ALTER_TABLE_CHANGE_TAG_COLUMN);
- setSQLInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
+ SAlterTableSQL* pAlterTable = tAlterTableSqlElems(&X, NULL, A, TSDB_ALTER_TABLE_CHANGE_TAG_COLUMN);
+ setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
}
cmd ::= ALTER TABLE ids(X) cpxName(F) SET TAG ids(Y) EQ tagitem(Z). {
@@ -723,14 +726,14 @@ cmd ::= ALTER TABLE ids(X) cpxName(F) SET TAG ids(Y) EQ tagitem(Z). {
SArray* A = tVariantListAppendToken(NULL, &Y, -1);
A = tVariantListAppend(A, &Z, -1);
- SAlterTableSQL* pAlterTable = tAlterTableSQLElems(&X, NULL, A, TSDB_ALTER_TABLE_UPDATE_TAG_VAL);
- setSQLInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
+ SAlterTableSQL* pAlterTable = tAlterTableSqlElems(&X, NULL, A, TSDB_ALTER_TABLE_UPDATE_TAG_VAL);
+ setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
}
////////////////////////////////////////kill statement///////////////////////////////////////
-cmd ::= KILL CONNECTION INTEGER(Y). {setKillSQL(pInfo, TSDB_SQL_KILL_CONNECTION, &Y);}
-cmd ::= KILL STREAM INTEGER(X) COLON(Z) INTEGER(Y). {X.n += (Z.n + Y.n); setKillSQL(pInfo, TSDB_SQL_KILL_STREAM, &X);}
-cmd ::= KILL QUERY INTEGER(X) COLON(Z) INTEGER(Y). {X.n += (Z.n + Y.n); setKillSQL(pInfo, TSDB_SQL_KILL_QUERY, &X);}
+cmd ::= KILL CONNECTION INTEGER(Y). {setKillSql(pInfo, TSDB_SQL_KILL_CONNECTION, &Y);}
+cmd ::= KILL STREAM INTEGER(X) COLON(Z) INTEGER(Y). {X.n += (Z.n + Y.n); setKillSql(pInfo, TSDB_SQL_KILL_STREAM, &X);}
+cmd ::= KILL QUERY INTEGER(X) COLON(Z) INTEGER(Y). {X.n += (Z.n + Y.n); setKillSql(pInfo, TSDB_SQL_KILL_QUERY, &X);}
%fallback ID ABORT AFTER ASC ATTACH BEFORE BEGIN CASCADE CLUSTER CONFLICT COPY DATABASE DEFERRED
DELIMITERS DESC DETACH EACH END EXPLAIN FAIL FOR GLOB IGNORE IMMEDIATE INITIALLY INSTEAD
diff --git a/src/query/src/qExecutor.c b/src/query/src/qExecutor.c
index 0d3b068a4a..7fb366160c 100644
--- a/src/query/src/qExecutor.c
+++ b/src/query/src/qExecutor.c
@@ -53,7 +53,7 @@
#define TIME_WINDOW_COPY(_dst, _src) do {\
(_dst).skey = (_src).skey;\
(_dst).ekey = (_src).ekey;\
-} while (0);
+} while (0)
enum {
// when query starts to execute, this status will set
@@ -178,11 +178,10 @@ static void getNextTimeWindow(SQuery* pQuery, STimeWindow* tw) {
#define IS_STASBLE_QUERY_OVER(_q) ((_q)->tableIndex >= (int32_t)((_q)->tableqinfoGroupInfo.numOfTables))
// todo move to utility
-static int32_t mergeIntoGroupResultImpl(SQInfo *pQInfo, SArray *group);
+static int32_t mergeIntoGroupResultImpl(SGroupResInfo* pGroupResInfo, SArray *pTableList, SQInfo* pQInfo);
static void setResultOutputBuf(SQueryRuntimeEnv *pRuntimeEnv, SResultRow *pResult);
static void setResultRowOutputBufInitCtx(SQueryRuntimeEnv *pRuntimeEnv, SResultRow *pResult);
-static void resetMergeResultBuf(SQueryRuntimeEnv* pRuntimeEnv, SQLFunctionCtx *pCtx, SResultRow *pRow);
static bool functionNeedToExecute(SQueryRuntimeEnv *pRuntimeEnv, SQLFunctionCtx *pCtx, int32_t functionId);
static void setExecParams(SQuery *pQuery, SQLFunctionCtx *pCtx, void* inputData, TSKEY *tsCol, SDataBlockInfo* pBlockInfo,
@@ -195,7 +194,6 @@ static bool hasMainOutput(SQuery *pQuery);
static void buildTagQueryResult(SQInfo *pQInfo);
static int32_t setAdditionalInfo(SQInfo *pQInfo, void *pTable, STableQueryInfo *pTableQueryInfo);
-static int32_t flushFromResultBuf(SQueryRuntimeEnv* pRuntimeEnv, SGroupResInfo* pGroupResInfo);
static int32_t checkForQueryBuf(size_t numOfTables);
static void releaseQueryBuf(size_t numOfTables);
static int32_t binarySearchForKey(char *pValue, int num, TSKEY key, int order);
@@ -291,7 +289,7 @@ void updateNumOfResult(SQueryRuntimeEnv *pRuntimeEnv, int32_t numOfRes) {
}
}
-static int32_t getMergeResultGroupId(int32_t groupIndex) {
+static UNUSED_FUNC int32_t getMergeResultGroupId(int32_t groupIndex) {
int32_t base = 50000000;
return base + (groupIndex * 10000);
}
@@ -466,16 +464,34 @@ static bool hasNullValue(SColIndex* pColIndex, SDataStatis *pStatis, SDataStatis
static SResultRow *doPrepareResultRowFromKey(SQueryRuntimeEnv *pRuntimeEnv, SResultRowInfo *pResultRowInfo, char *pData,
int16_t bytes, bool masterscan, uint64_t uid) {
+ bool existed = false;
SET_RES_WINDOW_KEY(pRuntimeEnv->keyBuf, pData, bytes, uid);
- int32_t *p1 =
- (int32_t *)taosHashGet(pRuntimeEnv->pResultRowHashTable, pRuntimeEnv->keyBuf, GET_RES_WINDOW_KEY_LEN(bytes));
- if (p1 != NULL) {
- pResultRowInfo->curIndex = *p1;
- } else {
- if (!masterscan) { // not master scan, do not add new timewindow
- return NULL;
+
+ SResultRow **p1 =
+ (SResultRow **)taosHashGet(pRuntimeEnv->pResultRowHashTable, pRuntimeEnv->keyBuf, GET_RES_WINDOW_KEY_LEN(bytes));
+
+ // in case of repeat scan/reverse scan, no new time window added.
+ if (QUERY_IS_INTERVAL_QUERY(pRuntimeEnv->pQuery)) {
+ if (!masterscan) { // the *p1 may be NULL in case of sliding+offset exists.
+ return (p1 != NULL)? *p1:NULL;
}
+ if (p1 != NULL) {
+ for(int32_t i = pResultRowInfo->size - 1; i >= 0; --i) {
+ if (pResultRowInfo->pResult[i] == (*p1)) {
+ pResultRowInfo->curIndex = i;
+ existed = true;
+ break;
+ }
+ }
+ }
+ } else {
+ if (p1 != NULL) { // group by column query
+ return *p1;
+ }
+ }
+
+ if (!existed) {
// TODO refactor
// more than the capacity, reallocate the resources
if (pResultRowInfo->size >= pResultRowInfo->capacity) {
@@ -499,17 +515,23 @@ static SResultRow *doPrepareResultRowFromKey(SQueryRuntimeEnv *pRuntimeEnv, SRes
pResultRowInfo->capacity = (int32_t)newCapacity;
}
- SResultRow *pResult = getNewResultRow(pRuntimeEnv->pool);
- pResultRowInfo->pResult[pResultRowInfo->size] = pResult;
- int32_t ret = initResultRow(pResult);
- if (ret != TSDB_CODE_SUCCESS) {
- longjmp(pRuntimeEnv->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
+ SResultRow *pResult = NULL;
+
+ if (p1 == NULL) {
+ pResult = getNewResultRow(pRuntimeEnv->pool);
+ int32_t ret = initResultRow(pResult);
+ if (ret != TSDB_CODE_SUCCESS) {
+ longjmp(pRuntimeEnv->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
+ }
+
+ // add a new result set for a new group
+ taosHashPut(pRuntimeEnv->pResultRowHashTable, pRuntimeEnv->keyBuf, GET_RES_WINDOW_KEY_LEN(bytes), &pResult, POINTER_BYTES);
+ } else {
+ pResult = *p1;
}
- // add a new result set for a new group
+ pResultRowInfo->pResult[pResultRowInfo->size] = pResult;
pResultRowInfo->curIndex = pResultRowInfo->size++;
- taosHashPut(pRuntimeEnv->pResultRowHashTable, pRuntimeEnv->keyBuf, GET_RES_WINDOW_KEY_LEN(bytes),
- (char *)&pResultRowInfo->curIndex, sizeof(int32_t));
}
// too many time window in query
@@ -591,7 +613,6 @@ static int32_t addNewWindowResultBuf(SResultRow *pWindowRes, SDiskbasedResultBuf
if (pData->num >= numOfRowsPerPage) {
// release current page first, and prepare the next one
releaseResBufPageInfo(pResultBuf, pi);
-
pData = getNewDataBuf(pResultBuf, tid, &pageId);
if (pData != NULL) {
assert(pData->num == 0); // number of elements must be 0 for new allocated buffer
@@ -614,24 +635,20 @@ static int32_t addNewWindowResultBuf(SResultRow *pWindowRes, SDiskbasedResultBuf
return 0;
}
-static int32_t setWindowOutputBufByKey(SQueryRuntimeEnv *pRuntimeEnv, SResultRowInfo *pResultRowInfo, SDataBlockInfo* pBockInfo,
- STimeWindow *win, bool masterscan, bool* newWind, SResultRow** pResult) {
+static int32_t setWindowOutputBufByKey(SQueryRuntimeEnv *pRuntimeEnv, SResultRowInfo *pResultRowInfo, STimeWindow *win,
+ bool masterscan, SResultRow** pResult, int64_t groupId) {
assert(win->skey <= win->ekey);
SDiskbasedResultBuf *pResultBuf = pRuntimeEnv->pResultBuf;
- // todo refactor
- int64_t uid = getResultInfoUId(pRuntimeEnv);
- SResultRow *pResultRow = doPrepareResultRowFromKey(pRuntimeEnv, pResultRowInfo, (char *)&win->skey, TSDB_KEYSIZE, masterscan, uid);
+ SResultRow *pResultRow = doPrepareResultRowFromKey(pRuntimeEnv, pResultRowInfo, (char *)&win->skey, TSDB_KEYSIZE, masterscan, groupId);
if (pResultRow == NULL) {
- *newWind = false;
- return masterscan? -1:0; // no master scan, no result generated means error occurs
+ *pResult = NULL;
+ return TSDB_CODE_SUCCESS;
}
- *newWind = true;
-
// not assign result buffer yet, add new result buffer
if (pResultRow->pageId == -1) {
- int32_t ret = addNewWindowResultBuf(pResultRow, pResultBuf, pBockInfo->tid, pRuntimeEnv->numOfRowsPerPage);
+ int32_t ret = addNewWindowResultBuf(pResultRow, pResultBuf, (int32_t) groupId, pRuntimeEnv->numOfRowsPerPage);
if (ret != TSDB_CODE_SUCCESS) {
return -1;
}
@@ -701,81 +718,48 @@ static FORCE_INLINE int32_t getForwardStepsInBlock(int32_t numOfRows, __block_se
return forwardStep;
}
-static int32_t updateResultRowCurrentIndex(SResultRowInfo* pWindowResInfo, TSKEY lastKey, bool ascQuery) {
- int32_t i = 0;
+static void doUpdateResultRowIndex(SResultRowInfo*pResultRowInfo, TSKEY lastKey, bool ascQuery) {
int64_t skey = TSKEY_INITIAL_VAL;
-
- int32_t numOfClosed = 0;
- for (i = 0; i < pWindowResInfo->size; ++i) {
- SResultRow *pResult = pWindowResInfo->pResult[i];
+ int32_t i = 0;
+ for (i = pResultRowInfo->size - 1; i >= 0; --i) {
+ SResultRow *pResult = pResultRowInfo->pResult[i];
if (pResult->closed) {
- numOfClosed += 1;
- continue;
- }
-
- TSKEY ekey = pResult->win.ekey;
- if ((ekey <= lastKey && ascQuery) || (pResult->win.skey >= lastKey && !ascQuery)) {
- closeResultRow(pWindowResInfo, i);
- } else {
- skey = pResult->win.skey;
break;
}
- }
- // all windows are closed, set the last one to be the skey
- if (skey == TSKEY_INITIAL_VAL) {
- assert(i == pWindowResInfo->size);
- pWindowResInfo->curIndex = pWindowResInfo->size - 1;
- } else {
- pWindowResInfo->curIndex = i;
- pWindowResInfo->prevSKey = pWindowResInfo->pResult[pWindowResInfo->curIndex]->win.skey;
- }
-
- return numOfClosed;
-}
-
-/**
- * NOTE: the query status only set for the first scan of master scan.
- */
-static int32_t doCheckQueryCompleted(SQueryRuntimeEnv *pRuntimeEnv, TSKEY lastKey, SResultRowInfo *pWindowResInfo) {
- SQuery *pQuery = pRuntimeEnv->pQuery;
- if (pRuntimeEnv->scanFlag != MASTER_SCAN || pWindowResInfo->size == 0) {
- return pWindowResInfo->size;
- }
-
- // no qualified results exist, abort check
- int32_t numOfClosed = 0;
- bool ascQuery = QUERY_IS_ASC_QUERY(pQuery);
-
- // query completed
- if ((lastKey >= pQuery->current->win.ekey && ascQuery) || (lastKey <= pQuery->current->win.ekey && (!ascQuery))) {
- closeAllResultRows(pWindowResInfo);
-
- pWindowResInfo->curIndex = pWindowResInfo->size - 1;
- setQueryStatus(pQuery, QUERY_COMPLETED | QUERY_RESBUF_FULL);
- } else { // set the current index to be the last unclosed window
- numOfClosed = updateResultRowCurrentIndex(pWindowResInfo, lastKey, ascQuery);
-
- // the number of completed slots are larger than the threshold, return current generated results to client.
- if (numOfClosed > pQuery->rec.threshold) {
- qDebug("QInfo:%p total result window:%d closed:%d, reached the output threshold %d, return",
- GET_QINFO_ADDR(pRuntimeEnv), pWindowResInfo->size, numOfClosed, pQuery->rec.threshold);
-
- setQueryStatus(pQuery, QUERY_RESBUF_FULL);
+ // new closed result rows
+ if ((pResult->win.ekey <= lastKey && ascQuery) || (pResult->win.skey >= lastKey && !ascQuery)) {
+ closeResultRow(pResultRowInfo, i);
} else {
- qDebug("QInfo:%p total result window:%d already closed:%d", GET_QINFO_ADDR(pRuntimeEnv), pWindowResInfo->size,
- numOfClosed);
+ skey = pResult->win.skey;
}
}
- // output has reached the limitation, set query completed
- if (pQuery->limit.limit > 0 && (pQuery->limit.limit + pQuery->limit.offset) <= numOfClosed &&
- pRuntimeEnv->scanFlag == MASTER_SCAN) {
- setQueryStatus(pQuery, QUERY_COMPLETED);
- }
+ // all result rows are closed, set the last one to be the skey
+ if (skey == TSKEY_INITIAL_VAL) {
+ pResultRowInfo->curIndex = pResultRowInfo->size - 1;
+ } else {
- assert(pWindowResInfo->prevSKey != TSKEY_INITIAL_VAL);
- return numOfClosed;
+ for (i = pResultRowInfo->size - 1; i >= 0; --i) {
+ SResultRow *pResult = pResultRowInfo->pResult[i];
+ if (pResult->closed) {
+ break;
+ }
+ }
+
+ pResultRowInfo->curIndex = i + 1; // current not closed result object
+ pResultRowInfo->prevSKey = pResultRowInfo->pResult[pResultRowInfo->curIndex]->win.skey;
+ }
+}
+
+static void updateResultRowIndex(SResultRowInfo* pResultRowInfo, STableQueryInfo* pTableQueryInfo, bool ascQuery) {
+ if ((pTableQueryInfo->lastKey > pTableQueryInfo->win.ekey && ascQuery) || (pTableQueryInfo->lastKey < pTableQueryInfo->win.ekey && (!ascQuery))) {
+ closeAllResultRows(pResultRowInfo);
+ pResultRowInfo->curIndex = pResultRowInfo->size - 1;
+ } else {
+ int32_t step = ascQuery? 1:-1;
+ doUpdateResultRowIndex(pResultRowInfo, pTableQueryInfo->lastKey - step, ascQuery);
+ }
}
static int32_t getNumOfRowsInTimeWindow(SQuery *pQuery, SDataBlockInfo *pDataBlockInfo, TSKEY *pPrimaryColumn,
@@ -818,52 +802,47 @@ static int32_t getNumOfRowsInTimeWindow(SQuery *pQuery, SDataBlockInfo *pDataBlo
return num;
}
-static void doBlockwiseApplyFunctions(SQueryRuntimeEnv *pRuntimeEnv, bool closed, STimeWindow *pWin, int32_t offset,
- int32_t forwardStep, TSKEY *tsCol, int32_t numOfTotal) {
- SQuery * pQuery = pRuntimeEnv->pQuery;
+static void doBlockwiseApplyFunctions(SQueryRuntimeEnv *pRuntimeEnv, STimeWindow *pWin, int32_t offset, int32_t forwardStep, TSKEY *tsCol, int32_t numOfTotal) {
+ SQuery *pQuery = pRuntimeEnv->pQuery;
SQLFunctionCtx *pCtx = pRuntimeEnv->pCtx;
bool hasPrev = pCtx[0].preAggVals.isSet;
- if (IS_MASTER_SCAN(pRuntimeEnv) || closed) {
- for (int32_t k = 0; k < pQuery->numOfOutput; ++k) {
- pCtx[k].nStartQueryTimestamp = pWin->skey;
- pCtx[k].size = forwardStep;
- pCtx[k].startOffset = (QUERY_IS_ASC_QUERY(pQuery)) ? offset : offset - (forwardStep - 1);
+ for (int32_t k = 0; k < pQuery->numOfOutput; ++k) {
+ pCtx[k].nStartQueryTimestamp = pWin->skey;
+ pCtx[k].size = forwardStep;
+ pCtx[k].startOffset = (QUERY_IS_ASC_QUERY(pQuery)) ? offset : offset - (forwardStep - 1);
- int32_t functionId = pQuery->pExpr1[k].base.functionId;
- if ((aAggs[functionId].nStatus & TSDB_FUNCSTATE_SELECTIVITY) != 0) {
- pCtx[k].ptsList = &tsCol[pCtx[k].startOffset];
- }
-
- // not a whole block involved in query processing, statistics data can not be used
- // NOTE: the original value of isSet have been changed here
- if (pCtx[k].preAggVals.isSet && forwardStep < numOfTotal) {
- pCtx[k].preAggVals.isSet = false;
- }
-
- if (functionNeedToExecute(pRuntimeEnv, &pCtx[k], functionId)) {
- aAggs[functionId].xFunction(&pCtx[k]);
- }
-
- // restore it
- pCtx[k].preAggVals.isSet = hasPrev;
+ int32_t functionId = pQuery->pExpr1[k].base.functionId;
+ if ((aAggs[functionId].nStatus & TSDB_FUNCSTATE_SELECTIVITY) != 0) {
+ pCtx[k].ptsList = &tsCol[pCtx[k].startOffset];
}
+
+ // not a whole block involved in query processing, statistics data can not be used
+ // NOTE: the original value of isSet have been changed here
+ if (pCtx[k].preAggVals.isSet && forwardStep < numOfTotal) {
+ pCtx[k].preAggVals.isSet = false;
+ }
+
+ if (functionNeedToExecute(pRuntimeEnv, &pCtx[k], functionId)) {
+ aAggs[functionId].xFunction(&pCtx[k]);
+ }
+
+ // restore it
+ pCtx[k].preAggVals.isSet = hasPrev;
}
}
-static void doRowwiseApplyFunctions(SQueryRuntimeEnv *pRuntimeEnv, bool closed, STimeWindow *pWin, int32_t offset) {
- SQuery * pQuery = pRuntimeEnv->pQuery;
+static void doRowwiseApplyFunctions(SQueryRuntimeEnv *pRuntimeEnv, STimeWindow *pWin, int32_t offset) {
+ SQuery *pQuery = pRuntimeEnv->pQuery;
SQLFunctionCtx *pCtx = pRuntimeEnv->pCtx;
- if (IS_MASTER_SCAN(pRuntimeEnv) || closed) {
- for (int32_t k = 0; k < pQuery->numOfOutput; ++k) {
- pCtx[k].nStartQueryTimestamp = pWin->skey;
+ for (int32_t k = 0; k < pQuery->numOfOutput; ++k) {
+ pCtx[k].nStartQueryTimestamp = pWin->skey;
- int32_t functionId = pQuery->pExpr1[k].base.functionId;
- if (functionNeedToExecute(pRuntimeEnv, &pCtx[k], functionId)) {
- aAggs[functionId].xFunctionF(&pCtx[k], offset);
- }
+ int32_t functionId = pQuery->pExpr1[k].base.functionId;
+ if (functionNeedToExecute(pRuntimeEnv, &pCtx[k], functionId)) {
+ aAggs[functionId].xFunctionF(&pCtx[k], offset);
}
}
}
@@ -1124,6 +1103,45 @@ static TSKEY getStartTsKey(SQuery* pQuery, SDataBlockInfo* pDataBlockInfo, TSKEY
return ts;
}
+static void doWindowBorderInterpolation(SQueryRuntimeEnv* pRuntimeEnv, SDataBlockInfo* pDataBlockInfo, SArray *pDataBlock,
+ SResultRow* pResult, STimeWindow* win, int32_t startPos, int32_t forwardStep) {
+ if (!pRuntimeEnv->timeWindowInterpo) {
+ return;
+ }
+
+ assert(pDataBlock != NULL);
+
+ SQuery* pQuery = pRuntimeEnv->pQuery;
+ int32_t step = GET_FORWARD_DIRECTION_FACTOR(pQuery->order.order);
+
+ SColumnInfoData *pColInfo = taosArrayGet(pDataBlock, 0);
+
+ TSKEY *tsCols = (TSKEY *)(pColInfo->pData);
+ bool done = resultRowInterpolated(pResult, RESULT_ROW_START_INTERP);
+ if (!done) {
+ int32_t startRowIndex = startPos;
+ bool interp = setTimeWindowInterpolationStartTs(pRuntimeEnv, startRowIndex, pDataBlockInfo->rows, pDataBlock, tsCols, win);
+ if (interp) {
+ setResultRowInterpo(pResult, RESULT_ROW_START_INTERP);
+ }
+ } else {
+ setNotInterpoWindowKey(pRuntimeEnv->pCtx, pQuery->numOfOutput, RESULT_ROW_START_INTERP);
+ }
+
+ done = resultRowInterpolated(pResult, RESULT_ROW_END_INTERP);
+ if (!done) {
+ int32_t endRowIndex = startPos + (forwardStep - 1) * step;
+
+ TSKEY endKey = QUERY_IS_ASC_QUERY(pQuery)? pDataBlockInfo->window.ekey:pDataBlockInfo->window.skey;
+ bool interp = setTimeWindowInterpolationEndTs(pRuntimeEnv, endRowIndex, pDataBlock, tsCols, endKey, win);
+ if (interp) {
+ setResultRowInterpo(pResult, RESULT_ROW_END_INTERP);
+ }
+ } else {
+ setNotInterpoWindowKey(pRuntimeEnv->pCtx, pQuery->numOfOutput, RESULT_ROW_END_INTERP);
+ }
+}
+
/**
* todo set the last value for pQueryTableInfo as in rowwiseapplyfunctions
* @param pRuntimeEnv
@@ -1139,7 +1157,9 @@ static void blockwiseApplyFunctions(SQueryRuntimeEnv *pRuntimeEnv, SDataStatis *
SQLFunctionCtx *pCtx = pRuntimeEnv->pCtx;
bool masterScan = IS_MASTER_SCAN(pRuntimeEnv);
- SQuery *pQuery = pRuntimeEnv->pQuery;
+ SQuery *pQuery = pRuntimeEnv->pQuery;
+ int64_t groupId = pQuery->current->groupIndex;
+
TSKEY *tsCols = NULL;
if (pDataBlock != NULL) {
SColumnInfoData *pColInfo = taosArrayGet(pDataBlock, 0);
@@ -1164,80 +1184,50 @@ static void blockwiseApplyFunctions(SQueryRuntimeEnv *pRuntimeEnv, SDataStatis *
TSKEY ts = getStartTsKey(pQuery, pDataBlockInfo, tsCols, step);
STimeWindow win = getActiveTimeWindow(pWindowResInfo, ts, pQuery);
- bool hasTimeWindow = false;
SResultRow* pResult = NULL;
- int32_t ret = setWindowOutputBufByKey(pRuntimeEnv, pWindowResInfo, pDataBlockInfo, &win, masterScan, &hasTimeWindow, &pResult);
- if (ret != TSDB_CODE_SUCCESS) {
- tfree(sasArray);
- return;
+ int32_t ret = setWindowOutputBufByKey(pRuntimeEnv, pWindowResInfo, &win, masterScan, &pResult, groupId);
+ if (ret != TSDB_CODE_SUCCESS || pResult == NULL) {
+ goto _end;
}
int32_t forwardStep = 0;
int32_t startPos = pQuery->pos;
- // in case of repeat scan/reverse scan, no new time window added.
- if (hasTimeWindow) {
- TSKEY ekey = reviseWindowEkey(pQuery, &win);
- forwardStep = getNumOfRowsInTimeWindow(pQuery, pDataBlockInfo, tsCols, pQuery->pos, ekey, searchFn, true);
+ TSKEY ekey = reviseWindowEkey(pQuery, &win);
+ forwardStep = getNumOfRowsInTimeWindow(pQuery, pDataBlockInfo, tsCols, pQuery->pos, ekey, searchFn, true);
- // prev time window not interpolation yet.
- int32_t curIndex = curTimeWindowIndex(pWindowResInfo);
- if (prevIndex != -1 && prevIndex < curIndex && pRuntimeEnv->timeWindowInterpo) {
- for(int32_t j = prevIndex; j < curIndex; ++j) {
- SResultRow *pRes = pWindowResInfo->pResult[j];
-
- STimeWindow w = pRes->win;
- ret = setWindowOutputBufByKey(pRuntimeEnv, pWindowResInfo, pDataBlockInfo, &w, masterScan, &hasTimeWindow, &pResult);
- assert(ret == TSDB_CODE_SUCCESS && !resultRowInterpolated(pResult, RESULT_ROW_END_INTERP));
-
- int32_t p = QUERY_IS_ASC_QUERY(pQuery)? 0:pDataBlockInfo->rows-1;
- doRowwiseTimeWindowInterpolation(pRuntimeEnv, pDataBlock, *(TSKEY*) pRuntimeEnv->prevRow[0], -1, tsCols[0], p, w.ekey, RESULT_ROW_END_INTERP);
- setResultRowInterpo(pResult, RESULT_ROW_END_INTERP);
- setNotInterpoWindowKey(pRuntimeEnv->pCtx, pQuery->numOfOutput, RESULT_ROW_START_INTERP);
-
- bool closed = getResultRowStatus(pWindowResInfo, curTimeWindowIndex(pWindowResInfo));
- doBlockwiseApplyFunctions(pRuntimeEnv, closed, &w, startPos, 0, tsCols, pDataBlockInfo->rows);
+ // prev time window not interpolation yet.
+ int32_t curIndex = curTimeWindowIndex(pWindowResInfo);
+ if (prevIndex != -1 && prevIndex < curIndex && pRuntimeEnv->timeWindowInterpo) {
+ for(int32_t j = prevIndex; j < curIndex; ++j) { // previous time window may be all closed already.
+ SResultRow *pRes = pWindowResInfo->pResult[j];
+ if (pRes->closed) {
+ assert(resultRowInterpolated(pRes, RESULT_ROW_START_INTERP) && resultRowInterpolated(pRes, RESULT_ROW_END_INTERP));
+ continue;
}
- // restore current time window
- ret = setWindowOutputBufByKey(pRuntimeEnv, pWindowResInfo, pDataBlockInfo, &win, masterScan, &hasTimeWindow, &pResult);
- assert (ret == TSDB_CODE_SUCCESS); // null data, too many state code
+ STimeWindow w = pRes->win;
+ ret = setWindowOutputBufByKey(pRuntimeEnv, pWindowResInfo, &w, masterScan, &pResult, groupId);
+ assert(ret == TSDB_CODE_SUCCESS && !resultRowInterpolated(pResult, RESULT_ROW_END_INTERP));
+
+ int32_t p = QUERY_IS_ASC_QUERY(pQuery)? 0:pDataBlockInfo->rows-1;
+ doRowwiseTimeWindowInterpolation(pRuntimeEnv, pDataBlock, *(TSKEY*) pRuntimeEnv->prevRow[0], -1, tsCols[0], p, w.ekey, RESULT_ROW_END_INTERP);
+ setResultRowInterpo(pResult, RESULT_ROW_END_INTERP);
+ setNotInterpoWindowKey(pRuntimeEnv->pCtx, pQuery->numOfOutput, RESULT_ROW_START_INTERP);
+
+ doBlockwiseApplyFunctions(pRuntimeEnv, &w, startPos, 0, tsCols, pDataBlockInfo->rows);
}
- // window start key interpolation
- if (pRuntimeEnv->timeWindowInterpo) {
- bool done = resultRowInterpolated(pResult, RESULT_ROW_START_INTERP);
- if (!done) {
- int32_t startRowIndex = pQuery->pos;
- bool interp = setTimeWindowInterpolationStartTs(pRuntimeEnv, startRowIndex, pDataBlockInfo->rows, pDataBlock, tsCols, &win);
- if (interp) {
- setResultRowInterpo(pResult, RESULT_ROW_START_INTERP);
- }
- } else {
- setNotInterpoWindowKey(pRuntimeEnv->pCtx, pQuery->numOfOutput, RESULT_ROW_START_INTERP);
- }
-
- done = resultRowInterpolated(pResult, RESULT_ROW_END_INTERP);
- if (!done) {
- int32_t endRowIndex = pQuery->pos + (forwardStep - 1) * step;
-
- TSKEY endKey = QUERY_IS_ASC_QUERY(pQuery)? pDataBlockInfo->window.ekey:pDataBlockInfo->window.skey;
- bool interp = setTimeWindowInterpolationEndTs(pRuntimeEnv, endRowIndex, pDataBlock, tsCols, endKey, &win);
- if (interp) {
- setResultRowInterpo(pResult, RESULT_ROW_END_INTERP);
- }
- } else {
- setNotInterpoWindowKey(pRuntimeEnv->pCtx, pQuery->numOfOutput, RESULT_ROW_END_INTERP);
- }
- }
-
- bool pStatus = getResultRowStatus(pWindowResInfo, curTimeWindowIndex(pWindowResInfo));
- doBlockwiseApplyFunctions(pRuntimeEnv, pStatus, &win, startPos, forwardStep, tsCols, pDataBlockInfo->rows);
+ // restore current time window
+ ret = setWindowOutputBufByKey(pRuntimeEnv, pWindowResInfo, &win, masterScan, &pResult, groupId);
+ assert (ret == TSDB_CODE_SUCCESS);
}
- int32_t index = pWindowResInfo->curIndex;
- STimeWindow nextWin = win;
+ // window start key interpolation
+ doWindowBorderInterpolation(pRuntimeEnv, pDataBlockInfo, pDataBlock, pResult, &win, pQuery->pos, forwardStep);
+ doBlockwiseApplyFunctions(pRuntimeEnv, &win, startPos, forwardStep, tsCols, pDataBlockInfo->rows);
+ STimeWindow nextWin = win;
while (1) {
int32_t prevEndPos = (forwardStep - 1) * step + startPos;
startPos = getNextQualifiedWindow(pRuntimeEnv, &nextWin, pDataBlockInfo, tsCols, searchFn, prevEndPos);
@@ -1246,50 +1236,19 @@ static void blockwiseApplyFunctions(SQueryRuntimeEnv *pRuntimeEnv, SDataStatis *
}
// null data, failed to allocate more memory buffer
- hasTimeWindow = false;
- if (setWindowOutputBufByKey(pRuntimeEnv, pWindowResInfo, pDataBlockInfo, &nextWin, masterScan, &hasTimeWindow, &pResult) !=
- TSDB_CODE_SUCCESS) {
+ int32_t code = setWindowOutputBufByKey(pRuntimeEnv, pWindowResInfo, &nextWin, masterScan, &pResult, groupId);
+ if (code != TSDB_CODE_SUCCESS || pResult == NULL) {
break;
}
- if (!hasTimeWindow) {
- continue;
- }
-
- TSKEY ekey = reviseWindowEkey(pQuery, &nextWin);
+ ekey = reviseWindowEkey(pQuery, &nextWin);
forwardStep = getNumOfRowsInTimeWindow(pQuery, pDataBlockInfo, tsCols, startPos, ekey, searchFn, true);
// window start(end) key interpolation
- if (pRuntimeEnv->timeWindowInterpo) {
- bool done = resultRowInterpolated(pResult, RESULT_ROW_START_INTERP);
- if (!done) {
- int32_t startRowIndex = startPos;
- bool interp = setTimeWindowInterpolationStartTs(pRuntimeEnv, startRowIndex, pDataBlockInfo->rows, pDataBlock, tsCols, &nextWin);
- if (interp) {
- setResultRowInterpo(pResult, RESULT_ROW_START_INTERP);
- }
- } else {
- setNotInterpoWindowKey(pRuntimeEnv->pCtx, pQuery->numOfOutput, RESULT_ROW_START_INTERP);
- }
-
- done = resultRowInterpolated(pResult, RESULT_ROW_END_INTERP);
- if (!done) {
- int32_t endRowIndex = startPos + (forwardStep - 1)*step;
- TSKEY endKey = QUERY_IS_ASC_QUERY(pQuery)? pDataBlockInfo->window.ekey:pDataBlockInfo->window.skey;
- bool interp = setTimeWindowInterpolationEndTs(pRuntimeEnv, endRowIndex, pDataBlock, tsCols, endKey, &nextWin);
- if (interp) {
- setResultRowInterpo(pResult, RESULT_ROW_END_INTERP);
- }
- } else {
- setNotInterpoWindowKey(pRuntimeEnv->pCtx, pQuery->numOfOutput, RESULT_ROW_END_INTERP);
- }
- }
-
- bool closed = getResultRowStatus(pWindowResInfo, curTimeWindowIndex(pWindowResInfo));
- doBlockwiseApplyFunctions(pRuntimeEnv, closed, &nextWin, startPos, forwardStep, tsCols, pDataBlockInfo->rows);
+ doWindowBorderInterpolation(pRuntimeEnv, pDataBlockInfo, pDataBlock, pResult, &nextWin, startPos, forwardStep);
+ doBlockwiseApplyFunctions(pRuntimeEnv, &nextWin, startPos, forwardStep, tsCols, pDataBlockInfo->rows);
}
- pWindowResInfo->curIndex = index;
} else {
/*
* the sqlfunctionCtx parameters should be set done before all functions are invoked,
@@ -1305,6 +1264,7 @@ static void blockwiseApplyFunctions(SQueryRuntimeEnv *pRuntimeEnv, SDataStatis *
}
}
+ _end:
if (pRuntimeEnv->timeWindowInterpo) {
saveDataBlockLastRow(pRuntimeEnv, pDataBlockInfo, pDataBlock);
}
@@ -1325,8 +1285,6 @@ static int32_t setGroupResultOutputBuf(SQueryRuntimeEnv *pRuntimeEnv, char *pDat
return -1;
}
- int32_t GROUPRESULTID = 1;
-
SDiskbasedResultBuf *pResultBuf = pRuntimeEnv->pResultBuf;
// not assign result buffer yet, add new result buffer, TODO remove it
@@ -1342,11 +1300,8 @@ static int32_t setGroupResultOutputBuf(SQueryRuntimeEnv *pRuntimeEnv, char *pDat
longjmp(pRuntimeEnv->env, TSDB_CODE_QRY_APP_ERROR);
}
- uint64_t uid = groupIndex;
- SResultRow *pResultRow = doPrepareResultRowFromKey(pRuntimeEnv, &pRuntimeEnv->windowResInfo, d, len, true, uid);
- if (pResultRow == NULL) {
- return -1;
- }
+ SResultRow *pResultRow = doPrepareResultRowFromKey(pRuntimeEnv, &pRuntimeEnv->windowResInfo, d, len, true, groupIndex);
+ assert (pResultRow != NULL);
int64_t v = -1;
GET_TYPED_DATA(v, int64_t, type, pData);
@@ -1363,7 +1318,7 @@ static int32_t setGroupResultOutputBuf(SQueryRuntimeEnv *pRuntimeEnv, char *pDat
}
if (pResultRow->pageId == -1) {
- int32_t ret = addNewWindowResultBuf(pResultRow, pResultBuf, GROUPRESULTID, pRuntimeEnv->numOfRowsPerPage);
+ int32_t ret = addNewWindowResultBuf(pResultRow, pResultBuf, groupIndex, pRuntimeEnv->numOfRowsPerPage);
if (ret != 0) {
return -1;
}
@@ -1498,7 +1453,7 @@ void doRowwiseTimeWindowInterpolation(SQueryRuntimeEnv* pRuntimeEnv, SArray* pDa
double v1 = 0, v2 = 0, v = 0;
if (prevRowIndex == -1) {
- GET_TYPED_DATA(v1, double, pColInfo->info.type, (char *)pRuntimeEnv->prevRow[k]);
+ GET_TYPED_DATA(v1, double, pColInfo->info.type, (char *)pRuntimeEnv->prevRow[index]);
} else {
GET_TYPED_DATA(v1, double, pColInfo->info.type, (char *)pColInfo->pData + prevRowIndex * pColInfo->info.bytes);
}
@@ -1565,6 +1520,8 @@ static void rowwiseApplyFunctions(SQueryRuntimeEnv *pRuntimeEnv, SDataStatis *pS
SQuery *pQuery = pRuntimeEnv->pQuery;
STableQueryInfo* item = pQuery->current;
+ int64_t groupId = item->groupIndex;
+
SColumnInfoData* pColumnInfoData = (SColumnInfoData *)taosArrayGet(pDataBlock, 0);
TSKEY *tsCols = (pColumnInfoData->info.type == TSDB_DATA_TYPE_TIMESTAMP)? (TSKEY*) pColumnInfoData->pData:NULL;
@@ -1635,15 +1592,10 @@ static void rowwiseApplyFunctions(SQueryRuntimeEnv *pRuntimeEnv, SDataStatis *pS
STimeWindow win = getActiveTimeWindow(pWindowResInfo, ts, pQuery);
- bool hasTimeWindow = false;
SResultRow* pResult = NULL;
- int32_t ret = setWindowOutputBufByKey(pRuntimeEnv, pWindowResInfo, pDataBlockInfo, &win, masterScan, &hasTimeWindow, &pResult);
- if (ret != TSDB_CODE_SUCCESS) { // null data, too many state code
- continue;
- }
-
- if (!hasTimeWindow) {
- continue;
+ int32_t ret = setWindowOutputBufByKey(pRuntimeEnv, pWindowResInfo, &win, masterScan, &pResult, groupId);
+ if (ret != TSDB_CODE_SUCCESS || pResult == NULL) { // null data, too many state code
+ goto _end;
}
// window start key interpolation
@@ -1653,19 +1605,20 @@ static void rowwiseApplyFunctions(SQueryRuntimeEnv *pRuntimeEnv, SDataStatis *pS
if (prevWindowIndex != -1 && prevWindowIndex < curIndex) {
for (int32_t k = prevWindowIndex; k < curIndex; ++k) {
SResultRow *pRes = pWindowResInfo->pResult[k];
+ if (pRes->closed) {
+ assert(resultRowInterpolated(pResult, RESULT_ROW_START_INTERP) && resultRowInterpolated(pResult, RESULT_ROW_END_INTERP));
+ continue;
+ }
- ret = setWindowOutputBufByKey(pRuntimeEnv, pWindowResInfo, pDataBlockInfo, &pRes->win, masterScan, &hasTimeWindow, &pResult);
+ ret = setWindowOutputBufByKey(pRuntimeEnv, pWindowResInfo, &pRes->win, masterScan, &pResult, groupId);
assert(ret == TSDB_CODE_SUCCESS && !resultRowInterpolated(pResult, RESULT_ROW_END_INTERP));
setTimeWindowEKeyInterp(pRuntimeEnv, pDataBlock, prevTs, prevRowIndex, ts, offset, pResult, &pRes->win);
-
- bool closed = getResultRowStatus(pWindowResInfo, curTimeWindowIndex(pWindowResInfo));
- doRowwiseApplyFunctions(pRuntimeEnv, closed, &pRes->win, offset);
+ doRowwiseApplyFunctions(pRuntimeEnv, &pRes->win, offset);
}
// restore current time window
- ret = setWindowOutputBufByKey(pRuntimeEnv, pWindowResInfo, pDataBlockInfo, &win, masterScan, &hasTimeWindow,
- &pResult);
+ ret = setWindowOutputBufByKey(pRuntimeEnv, pWindowResInfo, &win, masterScan, &pResult, groupId);
if (ret != TSDB_CODE_SUCCESS) { // null data, too many state code
continue;
}
@@ -1674,8 +1627,7 @@ static void rowwiseApplyFunctions(SQueryRuntimeEnv *pRuntimeEnv, SDataStatis *pS
setTimeWindowSKeyInterp(pRuntimeEnv, pDataBlock, prevTs, prevRowIndex, ts, offset, pResult, &win);
}
- bool closed = getResultRowStatus(pWindowResInfo, curTimeWindowIndex(pWindowResInfo));
- doRowwiseApplyFunctions(pRuntimeEnv, closed, &win, offset);
+ doRowwiseApplyFunctions(pRuntimeEnv, &win, offset);
STimeWindow nextWin = win;
int32_t index = pWindowResInfo->curIndex;
@@ -1692,16 +1644,13 @@ static void rowwiseApplyFunctions(SQueryRuntimeEnv *pRuntimeEnv, SDataStatis *pS
}
// null data, failed to allocate more memory buffer
- hasTimeWindow = false;
- if (setWindowOutputBufByKey(pRuntimeEnv, pWindowResInfo, pDataBlockInfo, &nextWin, masterScan, &hasTimeWindow, &pResult) != TSDB_CODE_SUCCESS) {
+ int32_t code = setWindowOutputBufByKey(pRuntimeEnv, pWindowResInfo, &nextWin, masterScan, &pResult, groupId);
+ if (code != TSDB_CODE_SUCCESS || pResult == NULL) {
break;
}
- if (hasTimeWindow) {
- setTimeWindowSKeyInterp(pRuntimeEnv, pDataBlock, prevTs, prevRowIndex, ts, offset, pResult, &nextWin);
- closed = getResultRowStatus(pWindowResInfo, curTimeWindowIndex(pWindowResInfo));
- doRowwiseApplyFunctions(pRuntimeEnv, closed, &nextWin, offset);
- }
+ setTimeWindowSKeyInterp(pRuntimeEnv, pDataBlock, prevTs, prevRowIndex, ts, offset, pResult, &nextWin);
+ doRowwiseApplyFunctions(pRuntimeEnv, &nextWin, offset);
}
pWindowResInfo->curIndex = index;
@@ -1736,6 +1685,7 @@ static void rowwiseApplyFunctions(SQueryRuntimeEnv *pRuntimeEnv, SDataStatis *pS
}
}
+ _end:
assert(offset >= 0);
if (tsCols != NULL) {
item->lastKey = tsCols[offset] + step;
@@ -1763,28 +1713,26 @@ static int32_t tableApplyFunctionsOnBlock(SQueryRuntimeEnv *pRuntimeEnv, SDataBl
SDataStatis *pStatis, __block_search_fn_t searchFn, SArray *pDataBlock) {
SQuery *pQuery = pRuntimeEnv->pQuery;
- STableQueryInfo* pTableQInfo = pQuery->current;
- SResultRowInfo* pWindowResInfo = &pRuntimeEnv->windowResInfo;
+ STableQueryInfo* pTableQueryInfo = pQuery->current;
+ SResultRowInfo* pResultRowInfo = &pRuntimeEnv->windowResInfo;
if (pQuery->numOfFilterCols > 0 || pRuntimeEnv->pTsBuf != NULL || pRuntimeEnv->groupbyNormalCol) {
- rowwiseApplyFunctions(pRuntimeEnv, pStatis, pDataBlockInfo, pWindowResInfo, pDataBlock);
+ rowwiseApplyFunctions(pRuntimeEnv, pStatis, pDataBlockInfo, pResultRowInfo, pDataBlock);
} else {
- blockwiseApplyFunctions(pRuntimeEnv, pStatis, pDataBlockInfo, pWindowResInfo, searchFn, pDataBlock);
+ blockwiseApplyFunctions(pRuntimeEnv, pStatis, pDataBlockInfo, pResultRowInfo, searchFn, pDataBlock);
}
- // update the lastkey of current table
+ // update the lastkey of current table for projection/aggregation query
TSKEY lastKey = QUERY_IS_ASC_QUERY(pQuery) ? pDataBlockInfo->window.ekey : pDataBlockInfo->window.skey;
- pTableQInfo->lastKey = lastKey + GET_FORWARD_DIRECTION_FACTOR(pQuery->order.order);
+ pTableQueryInfo->lastKey = lastKey + GET_FORWARD_DIRECTION_FACTOR(pQuery->order.order);
// interval query with limit applied
int32_t numOfRes = 0;
- if (QUERY_IS_INTERVAL_QUERY(pQuery)) {
- numOfRes = doCheckQueryCompleted(pRuntimeEnv, lastKey, pWindowResInfo);
- } else if (pRuntimeEnv->groupbyNormalCol) {
- closeAllResultRows(pWindowResInfo);
- numOfRes = pWindowResInfo->size;
+ if (QUERY_IS_INTERVAL_QUERY(pQuery) || pRuntimeEnv->groupbyNormalCol) {
+ numOfRes = pResultRowInfo->size;
+ updateResultRowIndex(pResultRowInfo, pTableQueryInfo, QUERY_IS_ASC_QUERY(pQuery));
} else { // projection query
- numOfRes = (int32_t)getNumOfResult(pRuntimeEnv);
+ numOfRes = (int32_t) getNumOfResult(pRuntimeEnv);
// update the number of output result
if (numOfRes > 0 && pQuery->checkBuffer == 1) {
@@ -1799,8 +1747,8 @@ static int32_t tableApplyFunctionsOnBlock(SQueryRuntimeEnv *pRuntimeEnv, SDataBl
setQueryStatus(pQuery, QUERY_COMPLETED);
}
- if (((pTableQInfo->lastKey > pTableQInfo->win.ekey) && QUERY_IS_ASC_QUERY(pQuery)) ||
- ((pTableQInfo->lastKey < pTableQInfo->win.ekey) && (!QUERY_IS_ASC_QUERY(pQuery)))) {
+ if (((pTableQueryInfo->lastKey > pTableQueryInfo->win.ekey) && QUERY_IS_ASC_QUERY(pQuery)) ||
+ ((pTableQueryInfo->lastKey < pTableQueryInfo->win.ekey) && (!QUERY_IS_ASC_QUERY(pQuery)))) {
setQueryStatus(pQuery, QUERY_COMPLETED);
}
}
@@ -2182,8 +2130,8 @@ static bool isFixedOutputQuery(SQueryRuntimeEnv* pRuntimeEnv) {
// todo refactor with isLastRowQuery
bool isPointInterpoQuery(SQuery *pQuery) {
for (int32_t i = 0; i < pQuery->numOfOutput; ++i) {
- int32_t functionID = pQuery->pExpr1[i].base.functionId;
- if (functionID == TSDB_FUNC_INTERP) {
+ int32_t functionId = pQuery->pExpr1[i].base.functionId;
+ if (functionId == TSDB_FUNC_INTERP) {
return true;
}
}
@@ -2618,6 +2566,8 @@ int32_t loadDataBlockOnDemand(SQueryRuntimeEnv *pRuntimeEnv, SResultRowInfo * pW
*status = BLK_DATA_NO_NEEDED;
SQuery *pQuery = pRuntimeEnv->pQuery;
+ int64_t groupId = pQuery->current->groupIndex;
+
SQueryCostInfo* pCost = &pRuntimeEnv->summary;
if (pQuery->numOfFilterCols > 0 || pRuntimeEnv->pTsBuf > 0) {
@@ -2634,15 +2584,13 @@ int32_t loadDataBlockOnDemand(SQueryRuntimeEnv *pRuntimeEnv, SResultRowInfo * pW
// the pCtx[i] result is belonged to previous time window since the outputBuf has not been set yet,
// the filter result may be incorrect. So in case of interval query, we need to set the correct time output buffer
if (QUERY_IS_INTERVAL_QUERY(pQuery)) {
- bool hasTimeWindow = false;
SResultRow* pResult = NULL;
bool masterScan = IS_MASTER_SCAN(pRuntimeEnv);
TSKEY k = QUERY_IS_ASC_QUERY(pQuery)? pBlockInfo->window.skey:pBlockInfo->window.ekey;
STimeWindow win = getActiveTimeWindow(pWindowResInfo, k, pQuery);
- if (setWindowOutputBufByKey(pRuntimeEnv, pWindowResInfo, pBlockInfo, &win, masterScan, &hasTimeWindow, &pResult) !=
- TSDB_CODE_SUCCESS) {
+ if (setWindowOutputBufByKey(pRuntimeEnv, pWindowResInfo, &win, masterScan, &pResult, groupId) != TSDB_CODE_SUCCESS) {
// todo handle error in set result for timewindow
}
}
@@ -2840,13 +2788,9 @@ static void doSetInitialTimewindow(SQueryRuntimeEnv* pRuntimeEnv, SDataBlockInfo
if (QUERY_IS_ASC_QUERY(pQuery)) {
getAlignQueryTimeWindow(pQuery, pBlockInfo->window.skey, pBlockInfo->window.skey, pQuery->window.ekey, &w);
- pWindowResInfo->startTime = w.skey;
pWindowResInfo->prevSKey = w.skey;
- } else {
- // the start position of the first time window in the endpoint that spreads beyond the queried last timestamp
+ } else { // the start position of the first time window in the endpoint that spreads beyond the queried last timestamp
getAlignQueryTimeWindow(pQuery, pBlockInfo->window.ekey, pQuery->window.ekey, pBlockInfo->window.ekey, &w);
-
- pWindowResInfo->startTime = pQuery->window.skey;
pWindowResInfo->prevSKey = w.skey;
}
}
@@ -2916,13 +2860,9 @@ static int64_t doScanAllDataBlocks(SQueryRuntimeEnv *pRuntimeEnv) {
setQueryStatus(pQuery, QUERY_COMPLETED);
}
- if (QUERY_IS_INTERVAL_QUERY(pQuery) && (IS_MASTER_SCAN(pRuntimeEnv)|| pRuntimeEnv->scanFlag == REPEAT_SCAN)) {
- if (Q_STATUS_EQUAL(pQuery->status, QUERY_COMPLETED)) {
- closeAllResultRows(&pRuntimeEnv->windowResInfo);
- pRuntimeEnv->windowResInfo.curIndex = pRuntimeEnv->windowResInfo.size - 1; // point to the last time window
- } else {
- assert(Q_STATUS_EQUAL(pQuery->status, QUERY_RESBUF_FULL));
- }
+ if (QUERY_IS_INTERVAL_QUERY(pQuery)) {
+ closeAllResultRows(&pRuntimeEnv->windowResInfo);
+ pRuntimeEnv->windowResInfo.curIndex = pRuntimeEnv->windowResInfo.size - 1; // point to the last time window
}
return 0;
@@ -3027,7 +2967,7 @@ void setTagVal(SQueryRuntimeEnv *pRuntimeEnv, void *pTable, void *tsdb) {
}
}
-static void doMerge(SQueryRuntimeEnv *pRuntimeEnv, int64_t timestamp, SResultRow *pWindowRes, bool mergeFlag) {
+static UNUSED_FUNC void doMerge(SQueryRuntimeEnv *pRuntimeEnv, int64_t timestamp, SResultRow *pWindowRes, bool mergeFlag) {
SQuery * pQuery = pRuntimeEnv->pQuery;
SQLFunctionCtx *pCtx = pRuntimeEnv->pCtx;
@@ -3176,19 +3116,18 @@ void UNUSED_FUNC displayInterResult(tFilePage **pdata, SQueryRuntimeEnv* pRuntim
typedef struct SCompSupporter {
STableQueryInfo **pTableQueryInfo;
- int32_t * position;
- SQInfo * pQInfo;
+ int32_t *rowIndex;
+ int32_t order;
} SCompSupporter;
int32_t tableResultComparFn(const void *pLeft, const void *pRight, void *param) {
- int32_t left = *(int32_t *)pLeft;
+ int32_t left = *(int32_t *)pLeft;
int32_t right = *(int32_t *)pRight;
SCompSupporter * supporter = (SCompSupporter *)param;
- SQueryRuntimeEnv *pRuntimeEnv = &supporter->pQInfo->runtimeEnv;
- int32_t leftPos = supporter->position[left];
- int32_t rightPos = supporter->position[right];
+ int32_t leftPos = supporter->rowIndex[left];
+ int32_t rightPos = supporter->rowIndex[right];
/* left source is exhausted */
if (leftPos == -1) {
@@ -3200,53 +3139,55 @@ int32_t tableResultComparFn(const void *pLeft, const void *pRight, void *param)
return -1;
}
- SResultRowInfo *pWindowResInfo1 = &supporter->pTableQueryInfo[left]->windowResInfo;
+ STableQueryInfo** pList = supporter->pTableQueryInfo;
+
+ SResultRowInfo *pWindowResInfo1 = &(pList[left]->windowResInfo);
SResultRow * pWindowRes1 = getResultRow(pWindowResInfo1, leftPos);
- tFilePage *page1 = getResBufPage(pRuntimeEnv->pResultBuf, pWindowRes1->pageId);
+ TSKEY leftTimestamp = pWindowRes1->win.skey;
- char *b1 = getPosInResultPage(pRuntimeEnv, PRIMARYKEY_TIMESTAMP_COL_INDEX, pWindowRes1, page1);
- TSKEY leftTimestamp = GET_INT64_VAL(b1);
-
- SResultRowInfo *pWindowResInfo2 = &supporter->pTableQueryInfo[right]->windowResInfo;
+ SResultRowInfo *pWindowResInfo2 = &(pList[right]->windowResInfo);
SResultRow * pWindowRes2 = getResultRow(pWindowResInfo2, rightPos);
- tFilePage *page2 = getResBufPage(pRuntimeEnv->pResultBuf, pWindowRes2->pageId);
-
- char *b2 = getPosInResultPage(pRuntimeEnv, PRIMARYKEY_TIMESTAMP_COL_INDEX, pWindowRes2, page2);
- TSKEY rightTimestamp = GET_INT64_VAL(b2);
+ TSKEY rightTimestamp = pWindowRes2->win.skey;
if (leftTimestamp == rightTimestamp) {
return 0;
}
- return leftTimestamp > rightTimestamp ? 1 : -1;
+ if (supporter->order == TSDB_ORDER_ASC) {
+ return (leftTimestamp > rightTimestamp)? 1:-1;
+ } else {
+ return (leftTimestamp < rightTimestamp)? 1:-1;
+ }
}
-int32_t mergeIntoGroupResult(SQInfo *pQInfo) {
+int32_t mergeGroupResult(SQInfo *pQInfo) {
int64_t st = taosGetTimestampUs();
- int32_t ret = TSDB_CODE_SUCCESS;
+
+ SGroupResInfo* pGroupResInfo = &pQInfo->groupResInfo;
int32_t numOfGroups = (int32_t)(GET_NUM_OF_TABLEGROUP(pQInfo));
-
while (pQInfo->groupIndex < numOfGroups) {
SArray *group = GET_TABLEGROUP(pQInfo, pQInfo->groupIndex);
- ret = mergeIntoGroupResultImpl(pQInfo, group);
- if (ret < 0) { // not enough disk space to save the data into disk
+
+ int32_t ret = mergeIntoGroupResultImpl(pGroupResInfo, group, pQInfo);
+ if (ret < 0) {
return -1;
}
- pQInfo->groupIndex += 1;
-
// this group generates at least one result, return results
- if (ret > 0) {
+ pQInfo->groupIndex += 1;
+ if (taosArrayGetSize(pGroupResInfo->pRows) > 0) {
break;
}
- assert(pQInfo->groupResInfo.numOfDataPages == 0);
qDebug("QInfo:%p no result in group %d, continue", pQInfo, pQInfo->groupIndex - 1);
+ taosArrayClear(pGroupResInfo->pRows);
+
+ pGroupResInfo->index = 0;
+ pGroupResInfo->rowId = 0;
}
- SGroupResInfo* info = &pQInfo->groupResInfo;
- if (pQInfo->groupIndex == numOfGroups && info->pageId == info->numOfDataPages) {
+ if (pQInfo->groupIndex == numOfGroups && taosArrayGetSize(pGroupResInfo->pRows) == 0) {
SET_STABLE_QUERY_OVER(pQInfo);
}
@@ -3258,89 +3199,28 @@ int32_t mergeIntoGroupResult(SQInfo *pQInfo) {
return TSDB_CODE_SUCCESS;
}
+static int32_t doCopyToSData(SQInfo *pQInfo, SResultRow **pRows, int32_t numOfRows, int32_t* index, int32_t orderType);
+
void copyResToQueryResultBuf(SQInfo *pQInfo, SQuery *pQuery) {
SGroupResInfo* pGroupResInfo = &pQInfo->groupResInfo;
- // all results have been return to client, try next group
- if (pGroupResInfo->pageId == pGroupResInfo->numOfDataPages) {
- pGroupResInfo->numOfDataPages = 0;
- pGroupResInfo->pageId = 0;
- pGroupResInfo->rowId = 0;
-
+ // all results in current group have been returned to client, try next group
+ if (pGroupResInfo->index >= taosArrayGetSize(pGroupResInfo->pRows)) {
// current results of group has been sent to client, try next group
- if (mergeIntoGroupResult(pQInfo) != TSDB_CODE_SUCCESS) {
+ if (mergeGroupResult(pQInfo) != TSDB_CODE_SUCCESS) {
return; // failed to save data in the disk
}
// check if all results has been sent to client
int32_t numOfGroup = (int32_t)(GET_NUM_OF_TABLEGROUP(pQInfo));
- if (pGroupResInfo->numOfDataPages == 0 && pQInfo->groupIndex == numOfGroup) {
+ if (taosArrayGetSize(pGroupResInfo->pRows) == 0 && pQInfo->groupIndex == numOfGroup) {
SET_STABLE_QUERY_OVER(pQInfo);
return;
}
}
- SQueryRuntimeEnv * pRuntimeEnv = &pQInfo->runtimeEnv;
- SDiskbasedResultBuf *pResultBuf = pRuntimeEnv->pResultBuf;
-
- int32_t id = pQInfo->groupResInfo.groupId;
- SIDList list = getDataBufPagesIdList(pResultBuf, id);
-
- int32_t offset = 0;
- int32_t numOfCopiedRows = 0;
-
- size_t size = taosArrayGetSize(list);
- assert(size == pGroupResInfo->numOfDataPages);
-
- bool done = false;
-
- //TODO add API for release none-dirty pages
-// SPageInfo* prev = NULL;
-
- for (int32_t j = pGroupResInfo->pageId; j < size; ++j) {
- SPageInfo* pi = *(SPageInfo**) taosArrayGet(list, j);
- tFilePage* pData = getResBufPage(pResultBuf, pi->pageId);
-
- // release previous buffer pages
-// if (prev == NULL) {
-// prev = pi;
-// } else {
-// if (prev->pageId != pi->pageId) {
-// releaseResBufPageInfo(pResultBuf, prev);
-// prev = pi;
-// }
-// }
-
- assert(pData->num > 0 && pData->num <= pRuntimeEnv->numOfRowsPerPage && pGroupResInfo->rowId < pData->num);
- int32_t numOfRes = (int32_t)(pData->num - pGroupResInfo->rowId);
-
- if (numOfRes > pQuery->rec.capacity - offset) {
- numOfCopiedRows = (int32_t)(pQuery->rec.capacity - offset);
- pGroupResInfo->rowId += numOfCopiedRows;
- done = true;
- } else {
- numOfCopiedRows = (int32_t)pData->num;
-
- pGroupResInfo->pageId += 1;
- pGroupResInfo->rowId = 0;
- }
-
- for (int32_t i = 0; i < pQuery->numOfOutput; ++i) {
- int32_t bytes = pRuntimeEnv->pCtx[i].outputBytes;
- char * pDest = pQuery->sdata[i]->data;
-
- memcpy(pDest + offset * bytes, pData->data + pRuntimeEnv->offset[i] * pRuntimeEnv->numOfRowsPerPage,
- (size_t)bytes * numOfCopiedRows);
- }
-
- offset += numOfCopiedRows;
- if (done) {
- break;
- }
- }
-
- assert(pQuery->rec.rows == 0);
- pQuery->rec.rows += offset;
+ int32_t size = (int32_t) taosArrayGetSize(pGroupResInfo->pRows);
+ pQuery->rec.rows = doCopyToSData(pQInfo, pGroupResInfo->pRows->pData, (int32_t) size, &pGroupResInfo->index, TSDB_ORDER_ASC);
}
int64_t getNumOfResultWindowRes(SQueryRuntimeEnv* pRuntimeEnv, SResultRow *pResultRow) {
@@ -3368,155 +3248,99 @@ int64_t getNumOfResultWindowRes(SQueryRuntimeEnv* pRuntimeEnv, SResultRow *pResu
return 0;
}
-int32_t mergeIntoGroupResultImpl(SQInfo *pQInfo, SArray *pGroup) {
+int32_t mergeIntoGroupResultImpl(SGroupResInfo* pGroupResInfo, SArray *pTableList, SQInfo* pQInfo) {
SQueryRuntimeEnv *pRuntimeEnv = &pQInfo->runtimeEnv;
- SQuery * pQuery = pRuntimeEnv->pQuery;
+ bool ascQuery = QUERY_IS_ASC_QUERY(pRuntimeEnv->pQuery);
- size_t size = taosArrayGetSize(pGroup);
- tFilePage **buffer = pQuery->sdata;
+ int32_t code = TSDB_CODE_SUCCESS;
- int32_t *posList = calloc(size, sizeof(int32_t));
- STableQueryInfo **pTableList = malloc(POINTER_BYTES * size);
+ int32_t *posList = NULL;
+ SLoserTreeInfo *pTree = NULL;
+ STableQueryInfo **pTableQueryInfoList = NULL;
- if (pTableList == NULL || posList == NULL) {
- tfree(posList);
- tfree(pTableList);
-
- qError("QInfo:%p failed alloc memory", pQInfo);
- longjmp(pRuntimeEnv->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
+ size_t size = taosArrayGetSize(pTableList);
+ if (pGroupResInfo->pRows == NULL) {
+ pGroupResInfo->pRows = taosArrayInit(100, POINTER_BYTES);
+ }
+
+ posList = calloc(size, sizeof(int32_t));
+ pTableQueryInfoList = malloc(POINTER_BYTES * size);
+
+ if (pTableQueryInfoList == NULL || posList == NULL) {
+ qError("QInfo:%p failed alloc memory", pQInfo);
+ code = TSDB_CODE_QRY_OUT_OF_MEMORY;
+ goto _end;
}
- // todo opt for the case of one table per group
int32_t numOfTables = 0;
- SIDList pageList = NULL;
- int32_t tid = -1;
-
for (int32_t i = 0; i < size; ++i) {
- STableQueryInfo *item = taosArrayGetP(pGroup, i);
-
- SIDList list = getDataBufPagesIdList(pRuntimeEnv->pResultBuf, TSDB_TABLEID(item->pTable)->tid);
- if (taosArrayGetSize(list) > 0 && item->windowResInfo.size > 0) {
- pTableList[numOfTables++] = item;
- tid = TSDB_TABLEID(item->pTable)->tid;
- pageList = list;
+ STableQueryInfo *item = taosArrayGetP(pTableList, i);
+ if (item->windowResInfo.size > 0) {
+ pTableQueryInfoList[numOfTables++] = item;
}
}
// there is no data in current group
+ // no need to merge results since only one table in each group
if (numOfTables == 0) {
- tfree(posList);
- tfree(pTableList);
- return 0;
- } else if (numOfTables == 1) { // no need to merge results since only one table in each group
- tfree(posList);
- tfree(pTableList);
-
- SGroupResInfo* pGroupResInfo = &pQInfo->groupResInfo;
-
- pGroupResInfo->numOfDataPages = (int32_t)taosArrayGetSize(pageList);
- pGroupResInfo->groupId = tid;
- pGroupResInfo->pageId = 0;
- pGroupResInfo->rowId = 0;
-
- return pGroupResInfo->numOfDataPages;
+ goto _end;
}
- SCompSupporter cs = {pTableList, posList, pQInfo};
+ SCompSupporter cs = {pTableQueryInfoList, posList, pRuntimeEnv->pQuery->order.order};
- SLoserTreeInfo *pTree = NULL;
- tLoserTreeCreate(&pTree, numOfTables, &cs, tableResultComparFn);
+ int32_t ret = tLoserTreeCreate(&pTree, numOfTables, &cs, tableResultComparFn);
+ if (ret != TSDB_CODE_SUCCESS) {
+ code = TSDB_CODE_QRY_OUT_OF_MEMORY;
+ goto _end;
+ }
- SResultRow* pRow = getNewResultRow(pRuntimeEnv->pool);
- resetMergeResultBuf(pRuntimeEnv, pRuntimeEnv->pCtx, pRow);
-
- pQInfo->groupResInfo.groupId = getMergeResultGroupId(pQInfo->groupIndex);
-
- // todo add windowRes iterator
- int64_t lastTimestamp = -1;
+ int64_t lastTimestamp = ascQuery? INT64_MIN:INT64_MAX;
int64_t startt = taosGetTimestampMs();
while (1) {
if (isQueryKilled(pQInfo)) {
qDebug("QInfo:%p it is already killed, abort", pQInfo);
-
- tfree(pTableList);
- tfree(posList);
- tfree(pTree);
- longjmp(pRuntimeEnv->env, TSDB_CODE_TSC_QUERY_CANCELLED);
+ code = TSDB_CODE_TSC_QUERY_CANCELLED;
+ goto _end;
}
- int32_t pos = pTree->pNode[0].index;
+ int32_t tableIndex = pTree->pNode[0].index;
- SResultRowInfo *pWindowResInfo = &pTableList[pos]->windowResInfo;
- SResultRow *pWindowRes = getResultRow(pWindowResInfo, cs.position[pos]);
- tFilePage *page = getResBufPage(pRuntimeEnv->pResultBuf, pWindowRes->pageId);
+ SResultRowInfo *pWindowResInfo = &pTableQueryInfoList[tableIndex]->windowResInfo;
+ SResultRow *pWindowRes = getResultRow(pWindowResInfo, cs.rowIndex[tableIndex]);
- char *b = getPosInResultPage(pRuntimeEnv, PRIMARYKEY_TIMESTAMP_COL_INDEX, pWindowRes, page);
- TSKEY ts = GET_INT64_VAL(b);
-
- assert(ts == pWindowRes->win.skey);
int64_t num = getNumOfResultWindowRes(pRuntimeEnv, pWindowRes);
if (num <= 0) {
- cs.position[pos] += 1;
+ cs.rowIndex[tableIndex] += 1;
- if (cs.position[pos] >= pWindowResInfo->size) {
- cs.position[pos] = -1;
-
- // all input sources are exhausted
- if (--numOfTables == 0) {
+ if (cs.rowIndex[tableIndex] >= pWindowResInfo->size) {
+ cs.rowIndex[tableIndex] = -1;
+ if (--numOfTables == 0) { // all input sources are exhausted
break;
}
}
} else {
- if (ts == lastTimestamp) { // merge with the last one
- doMerge(pRuntimeEnv, ts, pWindowRes, true);
- } else { // copy data to disk buffer
- if (buffer[0]->num == pQuery->rec.capacity) {
- if (flushFromResultBuf(pRuntimeEnv, &pQInfo->groupResInfo) != TSDB_CODE_SUCCESS) {
- return -1;
- }
+ assert((pWindowRes->win.skey >= lastTimestamp && ascQuery) || (pWindowRes->win.skey <= lastTimestamp && !ascQuery));
- resetMergeResultBuf(pRuntimeEnv, pRuntimeEnv->pCtx, pRow);
- }
-
- doMerge(pRuntimeEnv, ts, pWindowRes, false);
- buffer[0]->num += 1;
+ if (pWindowRes->win.skey != lastTimestamp) {
+ taosArrayPush(pGroupResInfo->pRows, &pWindowRes);
+ pWindowRes->numOfRows = (uint32_t) num;
}
- lastTimestamp = ts;
+ lastTimestamp = pWindowRes->win.skey;
- // move to the next element of current entry
- int32_t currentPageId = pWindowRes->pageId;
-
- cs.position[pos] += 1;
- if (cs.position[pos] >= pWindowResInfo->size) {
- cs.position[pos] = -1;
+ // move to the next row of current entry
+ if ((++cs.rowIndex[tableIndex]) >= pWindowResInfo->size) {
+ cs.rowIndex[tableIndex] = -1;
// all input sources are exhausted
- if (--numOfTables == 0) {
+ if ((--numOfTables) == 0) {
break;
}
- } else {
- // current page is not needed anymore
- SResultRow *pNextWindowRes = getResultRow(pWindowResInfo, cs.position[pos]);
- if (pNextWindowRes->pageId != currentPageId) {
- releaseResBufPage(pRuntimeEnv->pResultBuf, page);
- }
}
}
- tLoserTreeAdjust(pTree, pos + pTree->numOfEntries);
- }
-
- if (buffer[0]->num != 0) { // there are data in buffer
- if (flushFromResultBuf(pRuntimeEnv, &pQInfo->groupResInfo) != TSDB_CODE_SUCCESS) {
- qError("QInfo:%p failed to flush data into temp file, abort query", pQInfo);
-
- tfree(pTree);
- tfree(pTableList);
- tfree(posList);
- return -1;
- }
+ tLoserTreeAdjust(pTree, tableIndex + pTree->numOfEntries);
}
int64_t endt = taosGetTimestampMs();
@@ -3527,65 +3351,16 @@ int32_t mergeIntoGroupResultImpl(SQInfo *pQInfo, SArray *pGroup) {
qDebug("QInfo:%p result merge completed for group:%d, elapsed time:%" PRId64 " ms", pQInfo, pQInfo->groupIndex, endt - startt);
- tfree(pTableList);
+ _end:
+ tfree(pTableQueryInfoList);
tfree(posList);
tfree(pTree);
-// tfree(pResultInfo);
-// tfree(buf);
-
- return pQInfo->groupResInfo.numOfDataPages;
-}
-
-int32_t flushFromResultBuf(SQueryRuntimeEnv* pRuntimeEnv, SGroupResInfo* pGroupResInfo) {
- SQuery *pQuery = pRuntimeEnv->pQuery;
-
- SDiskbasedResultBuf *pResultBuf = pRuntimeEnv->pResultBuf;
-
- // the base value for group result, since the maximum number of table for each vnode will not exceed 100,000.
- int32_t pageId = -1;
- int32_t capacity = pResultBuf->numOfRowsPerPage;
-
- int32_t remain = (int32_t) pQuery->sdata[0]->num;
- int32_t offset = 0;
-
- while (remain > 0) {
- int32_t rows = (remain > capacity)? capacity:remain;
- assert(rows > 0);
-
- // get the output buffer page
- tFilePage *buf = getNewDataBuf(pResultBuf, pGroupResInfo->groupId, &pageId);
- buf->num = rows;
-
- // pagewisely copy to dest buffer
- for (int32_t i = 0; i < pQuery->numOfOutput; ++i) {
- int32_t bytes = pRuntimeEnv->pCtx[i].outputBytes;
-
- char* output = buf->data + pRuntimeEnv->offset[i] * pRuntimeEnv->numOfRowsPerPage;
- char* src = ((char *) pQuery->sdata[i]->data) + offset * bytes;
- memcpy(output, src, (size_t)(buf->num * bytes));
- }
-
- offset += rows;
- remain -= rows;
-
- pGroupResInfo->numOfDataPages += 1;
+ if (code != TSDB_CODE_SUCCESS) {
+ longjmp(pRuntimeEnv->env, code);
}
- return TSDB_CODE_SUCCESS;
-}
-
-void resetMergeResultBuf(SQueryRuntimeEnv* pRuntimeEnv, SQLFunctionCtx *pCtx, SResultRow *pRow) {
- SQuery* pQuery = pRuntimeEnv->pQuery;
-
- for (int32_t k = 0; k < pQuery->numOfOutput; ++k) {
- pCtx[k].aOutputBuf = pQuery->sdata[k]->data - pCtx[k].outputBytes;
- pCtx[k].size = 1;
- pCtx[k].startOffset = 0;
- pCtx[k].resultInfo = getResultCell(pRuntimeEnv, pRow, k);
-
- pQuery->sdata[k]->num = 0;
- }
+ return code;
}
static void updateTableQueryInfoForReverseScan(SQuery *pQuery, STableQueryInfo *pTableQueryInfo) {
@@ -3706,7 +3481,7 @@ void resetDefaultResInfoOutputBuf(SQueryRuntimeEnv *pRuntimeEnv) {
SQuery *pQuery = pRuntimeEnv->pQuery;
int32_t tid = 0;
- int64_t uid = getResultInfoUId(pRuntimeEnv);
+ int64_t uid = 0;
SResultRow* pRow = doPrepareResultRowFromKey(pRuntimeEnv, &pRuntimeEnv->windowResInfo, (char *)&tid, sizeof(tid), true, uid);
for (int32_t i = 0; i < pQuery->numOfOutput; ++i) {
@@ -3838,12 +3613,8 @@ bool needScanDataBlocksAgain(SQueryRuntimeEnv *pRuntimeEnv) {
for (int32_t i = 0; i < pWindowResInfo->size; ++i) {
SResultRow *pResult = getResultRow(pWindowResInfo, i);
- if (!pResult->closed) {
- continue;
- }
setResultOutputBuf(pRuntimeEnv, pResult);
-
for (int32_t j = 0; j < pQuery->numOfOutput; ++j) {
int16_t functId = pQuery->pExpr1[j].base.functionId;
if (functId == TSDB_FUNC_TS) {
@@ -4127,9 +3898,9 @@ void destroyTableQueryInfoImpl(STableQueryInfo *pTableQueryInfo) {
* @param pDataBlockInfo
*/
void setExecutionContext(SQInfo *pQInfo, int32_t groupIndex, TSKEY nextKey) {
- SQueryRuntimeEnv *pRuntimeEnv = &pQInfo->runtimeEnv;
+ SQueryRuntimeEnv *pRuntimeEnv = &pQInfo->runtimeEnv;
STableQueryInfo *pTableQueryInfo = pRuntimeEnv->pQuery->current;
- SResultRowInfo *pWindowResInfo = &pRuntimeEnv->windowResInfo;
+ SResultRowInfo *pWindowResInfo = &pRuntimeEnv->windowResInfo;
// lastKey needs to be updated
pTableQueryInfo->lastKey = nextKey;
@@ -4142,12 +3913,10 @@ void setExecutionContext(SQInfo *pQInfo, int32_t groupIndex, TSKEY nextKey) {
return;
}
- uint64_t uid = getResultInfoUId(pRuntimeEnv);
+ int64_t uid = 0;
SResultRow *pResultRow = doPrepareResultRowFromKey(pRuntimeEnv, pWindowResInfo, (char *)&groupIndex,
sizeof(groupIndex), true, uid);
- if (pResultRow == NULL) {
- return;
- }
+ assert (pResultRow != NULL);
/*
* not assign result buffer yet, add new result buffer
@@ -4293,7 +4062,7 @@ void setIntervalQueryRange(SQInfo *pQInfo, TSKEY key) {
/**
* In handling the both ascending and descending order super table query, we need to find the first qualified
* timestamp of this table, and then set the first qualified start timestamp.
- * In ascending query, key is the first qualified timestamp. However, in the descending order query, additional
+ * In ascending query, the key is the first qualified timestamp. However, in the descending order query, additional
* operations involve.
*/
STimeWindow w = TSWINDOW_INITIALIZER;
@@ -4302,7 +4071,6 @@ void setIntervalQueryRange(SQInfo *pQInfo, TSKEY key) {
TSKEY sk = MIN(win.skey, win.ekey);
TSKEY ek = MAX(win.skey, win.ekey);
getAlignQueryTimeWindow(pQuery, win.skey, sk, ek, &w);
- pWindowResInfo->startTime = pTableQueryInfo->win.skey; // windowSKey may be 0 in case of 1970 timestamp
if (pWindowResInfo->prevSKey == TSKEY_INITIAL_VAL) {
if (!QUERY_IS_ASC_QUERY(pQuery)) {
@@ -4341,36 +4109,33 @@ bool needPrimaryTimestampCol(SQuery *pQuery, SDataBlockInfo *pDataBlockInfo) {
return loadPrimaryTS;
}
-static int32_t doCopyToSData(SQInfo *pQInfo, SResultRowInfo *pResultInfo, int32_t orderType) {
+static int32_t doCopyToSData(SQInfo *pQInfo, SResultRow **pRows, int32_t numOfRows, int32_t *index, int32_t orderType) {
SQueryRuntimeEnv *pRuntimeEnv = &pQInfo->runtimeEnv;
SQuery * pQuery = pRuntimeEnv->pQuery;
int32_t numOfResult = 0;
- int32_t startIdx = 0;
+ int32_t start = 0;
int32_t step = -1;
qDebug("QInfo:%p start to copy data from windowResInfo to query buf", pQInfo);
- int32_t totalSet = numOfClosedResultRows(pResultInfo);
- SResultRow** result = pResultInfo->pResult;
-
if (orderType == TSDB_ORDER_ASC) {
- startIdx = pQInfo->groupIndex;
+ start = (*index);
step = 1;
} else { // desc order copy all data
- startIdx = totalSet - pQInfo->groupIndex - 1;
+ start = numOfRows - (*index) - 1;
step = -1;
}
SGroupResInfo* pGroupResInfo = &pQInfo->groupResInfo;
- for (int32_t i = startIdx; (i < totalSet) && (i >= 0); i += step) {
- if (result[i]->numOfRows == 0) {
- pQInfo->groupIndex += 1;
+ for (int32_t i = start; (i < numOfRows) && (i >= 0); i += step) {
+ if (pRows[i]->numOfRows == 0) {
+ (*index) += 1;
pGroupResInfo->rowId = 0;
continue;
}
- int32_t numOfRowsToCopy = result[i]->numOfRows - pGroupResInfo->rowId;
+ int32_t numOfRowsToCopy = pRows[i]->numOfRows - pGroupResInfo->rowId;
int32_t oldOffset = pGroupResInfo->rowId;
/*
@@ -4382,16 +4147,16 @@ static int32_t doCopyToSData(SQInfo *pQInfo, SResultRowInfo *pResultInfo, int32_
pGroupResInfo->rowId += numOfRowsToCopy;
} else {
pGroupResInfo->rowId = 0;
- pQInfo->groupIndex += 1;
+ (*index) += 1;
}
- tFilePage *page = getResBufPage(pRuntimeEnv->pResultBuf, result[i]->pageId);
+ tFilePage *page = getResBufPage(pRuntimeEnv->pResultBuf, pRows[i]->pageId);
for (int32_t j = 0; j < pQuery->numOfOutput; ++j) {
int32_t size = pRuntimeEnv->pCtx[j].outputBytes;
char *out = pQuery->sdata[j]->data + numOfResult * size;
- char *in = getPosInResultPage(pRuntimeEnv, j, result[i], page);
+ char *in = getPosInResultPage(pRuntimeEnv, j, pRows[i], page);
memcpy(out, in + oldOffset * size, size * numOfRowsToCopy);
}
@@ -4422,10 +4187,9 @@ void copyFromWindowResToSData(SQInfo *pQInfo, SResultRowInfo *pResultInfo) {
SQuery *pQuery = pQInfo->runtimeEnv.pQuery;
int32_t orderType = (pQuery->pGroupbyExpr != NULL) ? pQuery->pGroupbyExpr->orderType : TSDB_ORDER_ASC;
- int32_t numOfResult = doCopyToSData(pQInfo, pResultInfo, orderType);
+ int32_t numOfResult = doCopyToSData(pQInfo, pResultInfo->pResult, pResultInfo->size, &pQInfo->groupIndex, orderType);
pQuery->rec.rows += numOfResult;
-
assert(pQuery->rec.rows <= pQuery->rec.capacity);
}
@@ -4457,25 +4221,17 @@ static void stableApplyFunctionsOnBlock(SQueryRuntimeEnv *pRuntimeEnv, SDataBloc
SQuery * pQuery = pRuntimeEnv->pQuery;
STableQueryInfo* pTableQueryInfo = pQuery->current;
- SResultRowInfo * pWindowResInfo = &pTableQueryInfo->windowResInfo;
+ SResultRowInfo * pResultRowInfo = &pTableQueryInfo->windowResInfo;
pQuery->pos = QUERY_IS_ASC_QUERY(pQuery)? 0 : pDataBlockInfo->rows - 1;
if (pQuery->numOfFilterCols > 0 || pRuntimeEnv->pTsBuf != NULL || pRuntimeEnv->groupbyNormalCol) {
- rowwiseApplyFunctions(pRuntimeEnv, pStatis, pDataBlockInfo, pWindowResInfo, pDataBlock);
+ rowwiseApplyFunctions(pRuntimeEnv, pStatis, pDataBlockInfo, pResultRowInfo, pDataBlock);
} else {
- blockwiseApplyFunctions(pRuntimeEnv, pStatis, pDataBlockInfo, pWindowResInfo, searchFn, pDataBlock);
+ blockwiseApplyFunctions(pRuntimeEnv, pStatis, pDataBlockInfo, pResultRowInfo, searchFn, pDataBlock);
}
if (QUERY_IS_INTERVAL_QUERY(pQuery)) {
- bool ascQuery = QUERY_IS_ASC_QUERY(pQuery);
-
- // TODO refactor
- if ((pTableQueryInfo->lastKey >= pTableQueryInfo->win.ekey && ascQuery) || (pTableQueryInfo->lastKey <= pTableQueryInfo->win.ekey && (!ascQuery))) {
- closeAllResultRows(pWindowResInfo);
- pWindowResInfo->curIndex = pWindowResInfo->size - 1;
- } else {
- updateResultRowCurrentIndex(pWindowResInfo, pTableQueryInfo->lastKey, ascQuery);
- }
+ updateResultRowIndex(pResultRowInfo, pTableQueryInfo, QUERY_IS_ASC_QUERY(pQuery));
}
}
@@ -4547,7 +4303,9 @@ static void doCopyQueryResultToMsg(SQInfo *pQInfo, int32_t numOfRows, char *data
*(int32_t*)data = htonl(numOfTables);
data += sizeof(int32_t);
+ int32_t total = 0;
STableIdInfo* item = taosHashIterate(pQInfo->arrTableIdInfo, NULL);
+
while(item) {
STableIdInfo* pDst = (STableIdInfo*)data;
pDst->uid = htobe64(item->uid);
@@ -4555,9 +4313,14 @@ static void doCopyQueryResultToMsg(SQInfo *pQInfo, int32_t numOfRows, char *data
pDst->key = htobe64(item->key);
data += sizeof(STableIdInfo);
+ total++;
+
+ qDebug("QInfo:%p set subscribe info, tid:%d, uid:%"PRIu64", skey:%"PRId64, pQInfo, item->tid, item->uid, item->key);
item = taosHashIterate(pQInfo->arrTableIdInfo, item);
}
+ qDebug("QInfo:%p set %d subscribe info", pQInfo, total);
+
// Check if query is completed or not for stable query or normal table query respectively.
if (Q_STATUS_EQUAL(pQuery->status, QUERY_COMPLETED)) {
if (pQInfo->runtimeEnv.stableQuery) {
@@ -4809,13 +4572,10 @@ static bool skipTimeInterval(SQueryRuntimeEnv *pRuntimeEnv, TSKEY* start) {
if (QUERY_IS_ASC_QUERY(pQuery)) {
if (pWindowResInfo->prevSKey == TSKEY_INITIAL_VAL) {
getAlignQueryTimeWindow(pQuery, blockInfo.window.skey, blockInfo.window.skey, pQuery->window.ekey, &w);
- pWindowResInfo->startTime = w.skey;
pWindowResInfo->prevSKey = w.skey;
}
} else {
getAlignQueryTimeWindow(pQuery, blockInfo.window.ekey, pQuery->window.ekey, blockInfo.window.ekey, &w);
-
- pWindowResInfo->startTime = pQuery->window.skey;
pWindowResInfo->prevSKey = w.skey;
}
@@ -4918,7 +4678,6 @@ static int32_t setupQueryHandle(void* tsdb, SQInfo* pQInfo, bool isSTableQuery)
// update the query time window
pQuery->window = cond.twindow;
-
if (pQInfo->tableGroupInfo.numOfTables == 0) {
pQInfo->tableqinfoGroupInfo.numOfTables = 0;
} else {
@@ -5438,10 +5197,10 @@ static void sequentialTableProcess(SQInfo *pQInfo) {
scanMultiTableDataBlocks(pQInfo);
pQInfo->groupIndex += 1;
- SResultRowInfo *pWindowResInfo = &pRuntimeEnv->windowResInfo;
+ taosArrayDestroy(s);
// no results generated for current group, continue to try the next group
- taosArrayDestroy(s);
+ SResultRowInfo *pWindowResInfo = &pRuntimeEnv->windowResInfo;
if (pWindowResInfo->size <= 0) {
continue;
}
@@ -5468,8 +5227,7 @@ static void sequentialTableProcess(SQInfo *pQInfo) {
pQInfo->groupIndex = currentGroupIndex; // restore the group index
assert(pQuery->rec.rows == pWindowResInfo->size);
-
- clearClosedResultRows(pRuntimeEnv, &pRuntimeEnv->windowResInfo);
+ resetResultRowInfo(pRuntimeEnv, &pRuntimeEnv->windowResInfo);
break;
}
} else if (pRuntimeEnv->queryWindowIdentical && pRuntimeEnv->pTsBuf == NULL && !isTSCompQuery(pQuery)) {
@@ -5766,6 +5524,7 @@ static void doRestoreContext(SQInfo *pQInfo) {
SQuery * pQuery = pRuntimeEnv->pQuery;
SWAP(pQuery->window.skey, pQuery->window.ekey, TSKEY);
+ SWITCH_ORDER(pQuery->order.order);
if (pRuntimeEnv->pTsBuf != NULL) {
SWITCH_ORDER(pRuntimeEnv->pTsBuf->cur.order);
@@ -5805,9 +5564,6 @@ static void multiTableQueryProcess(SQInfo *pQInfo) {
*/
if (QUERY_IS_INTERVAL_QUERY(pQuery)) {
copyResToQueryResultBuf(pQInfo, pQuery);
-#ifdef _DEBUG_VIEW
- displayInterResult(pQuery->sdata, pRuntimeEnv, pQuery->sdata[0]->num);
-#endif
} else {
copyFromWindowResToSData(pQInfo, &pRuntimeEnv->windowResInfo);
}
@@ -5852,7 +5608,7 @@ static void multiTableQueryProcess(SQInfo *pQInfo) {
}
if (QUERY_IS_INTERVAL_QUERY(pQuery) || isSumAvgRateQuery(pQuery)) {
- if (mergeIntoGroupResult(pQInfo) == TSDB_CODE_SUCCESS) {
+ if (mergeGroupResult(pQInfo) == TSDB_CODE_SUCCESS) {
copyResToQueryResultBuf(pQInfo, pQuery);
#ifdef _DEBUG_VIEW
@@ -6024,33 +5780,6 @@ static void tableMultiOutputProcess(SQInfo *pQInfo, STableQueryInfo* pTableInfo)
}
}
-static void tableIntervalProcessImpl(SQueryRuntimeEnv *pRuntimeEnv, TSKEY start) {
- SQuery *pQuery = pRuntimeEnv->pQuery;
-
- while (1) {
- scanOneTableDataBlocks(pRuntimeEnv, start);
-
- assert(!Q_STATUS_EQUAL(pQuery->status, QUERY_NOT_COMPLETED));
- finalizeQueryResult(pRuntimeEnv);
-
- // here we can ignore the records in case of no interpolation
- // todo handle offset, in case of top/bottom interval query
- if ((pQuery->numOfFilterCols > 0 || pRuntimeEnv->pTsBuf != NULL) && pQuery->limit.offset > 0 &&
- pQuery->fillType == TSDB_FILL_NONE) {
- // maxOutput <= 0, means current query does not generate any results
- int32_t numOfClosed = numOfClosedResultRows(&pRuntimeEnv->windowResInfo);
-
- int32_t c = (int32_t)(MIN(numOfClosed, pQuery->limit.offset));
- popFrontResultRow(pRuntimeEnv, &pRuntimeEnv->windowResInfo, c);
- pQuery->limit.offset -= c;
- }
-
- if (Q_STATUS_EQUAL(pQuery->status, QUERY_COMPLETED | QUERY_RESBUF_FULL)) {
- break;
- }
- }
-}
-
// handle time interval query on table
static void tableIntervalProcess(SQInfo *pQInfo, STableQueryInfo* pTableInfo) {
SQueryRuntimeEnv *pRuntimeEnv = &(pQInfo->runtimeEnv);
@@ -6058,7 +5787,6 @@ static void tableIntervalProcess(SQInfo *pQInfo, STableQueryInfo* pTableInfo) {
SQuery *pQuery = pRuntimeEnv->pQuery;
pQuery->current = pTableInfo;
- int32_t numOfFilled = 0;
TSKEY newStartKey = TSKEY_INITIAL_VAL;
// skip blocks without load the actual data block from file if no filter condition present
@@ -6070,59 +5798,39 @@ static void tableIntervalProcess(SQInfo *pQInfo, STableQueryInfo* pTableInfo) {
}
}
- while (1) {
- tableIntervalProcessImpl(pRuntimeEnv, newStartKey);
+ scanOneTableDataBlocks(pRuntimeEnv, newStartKey);
+ assert(!Q_STATUS_EQUAL(pQuery->status, QUERY_NOT_COMPLETED));
- if (QUERY_IS_INTERVAL_QUERY(pQuery)) {
- pQInfo->groupIndex = 0; // always start from 0
- pQuery->rec.rows = 0;
- copyFromWindowResToSData(pQInfo, &pRuntimeEnv->windowResInfo);
+ finalizeQueryResult(pRuntimeEnv);
- popFrontResultRow(pRuntimeEnv, &pRuntimeEnv->windowResInfo, pQInfo->groupIndex);
- }
+ // skip offset result rows
+ pQuery->rec.rows = 0;
- // no result generated, abort
- if (pQuery->rec.rows == 0 || pRuntimeEnv->groupbyNormalCol) {
- break;
- }
-
- doSecondaryArithmeticProcess(pQuery);
-
- // the offset is handled at prepare stage if no interpolation involved
- if (pQuery->fillType == TSDB_FILL_NONE) {
- limitResults(pRuntimeEnv);
- break;
- } else {
- taosFillSetStartInfo(pRuntimeEnv->pFillInfo, (int32_t)pQuery->rec.rows, pQuery->window.ekey);
- taosFillCopyInputDataFromFilePage(pRuntimeEnv->pFillInfo, (const tFilePage**) pQuery->sdata);
- numOfFilled = 0;
-
- pQuery->rec.rows = doFillGapsInResults(pRuntimeEnv, (tFilePage **)pQuery->sdata, &numOfFilled);
- if (pQuery->rec.rows > 0 || Q_STATUS_EQUAL(pQuery->status, QUERY_COMPLETED)) {
- limitResults(pRuntimeEnv);
- break;
- }
-
- // no result generated yet, continue retrieve data
- pQuery->rec.rows = 0;
- }
- }
-
- // all data scanned, the group by normal column can return
- if (pRuntimeEnv->groupbyNormalCol) { // todo refactor with merge interval time result
- // maxOutput <= 0, means current query does not generate any results
+ if (pQuery->fillType == TSDB_FILL_NONE) {
+ // all data scanned, the group by normal column can return
int32_t numOfClosed = numOfClosedResultRows(&pRuntimeEnv->windowResInfo);
+ if (pQuery->limit.offset > numOfClosed) {
+ return;
+ }
- if ((pQuery->limit.offset > 0 && pQuery->limit.offset < numOfClosed) || pQuery->limit.offset == 0) {
- // skip offset result rows
- popFrontResultRow(pRuntimeEnv, &pRuntimeEnv->windowResInfo, (int32_t) pQuery->limit.offset);
+ pQInfo->groupIndex = (int32_t) pQuery->limit.offset;
- pQuery->rec.rows = 0;
- pQInfo->groupIndex = 0;
- copyFromWindowResToSData(pQInfo, &pRuntimeEnv->windowResInfo);
- popFrontResultRow(pRuntimeEnv, &pRuntimeEnv->windowResInfo, pQInfo->groupIndex);
+ copyFromWindowResToSData(pQInfo, &pRuntimeEnv->windowResInfo);
+ doSecondaryArithmeticProcess(pQuery);
- doSecondaryArithmeticProcess(pQuery);
+ limitResults(pRuntimeEnv);
+ } else {
+
+ copyFromWindowResToSData(pQInfo, &pRuntimeEnv->windowResInfo);
+ doSecondaryArithmeticProcess(pQuery);
+
+ taosFillSetStartInfo(pRuntimeEnv->pFillInfo, (int32_t)pQuery->rec.rows, pQuery->window.ekey);
+ taosFillCopyInputDataFromFilePage(pRuntimeEnv->pFillInfo, (const tFilePage **)pQuery->sdata);
+
+ int32_t numOfFilled = 0;
+ pQuery->rec.rows = doFillGapsInResults(pRuntimeEnv, (tFilePage **)pQuery->sdata, &numOfFilled);
+
+ if (pQuery->rec.rows > 0 || Q_STATUS_EQUAL(pQuery->status, QUERY_COMPLETED)) {
limitResults(pRuntimeEnv);
}
}
@@ -6133,7 +5841,6 @@ static void tableQueryImpl(SQInfo *pQInfo) {
SQuery * pQuery = pRuntimeEnv->pQuery;
if (queryHasRemainResForTableQuery(pRuntimeEnv)) {
-
if (pQuery->fillType != TSDB_FILL_NONE) {
/*
* There are remain results that are not returned due to result interpolation
@@ -6150,23 +5857,23 @@ static void tableQueryImpl(SQInfo *pQInfo) {
return;
} else {
pQuery->rec.rows = 0;
- pQInfo->groupIndex = 0; // always start from 0
+ assert(pRuntimeEnv->windowResInfo.size > 0);
- if (pRuntimeEnv->windowResInfo.size > 0) {
+ if (pQInfo->groupIndex < pRuntimeEnv->windowResInfo.size) {
copyFromWindowResToSData(pQInfo, &pRuntimeEnv->windowResInfo);
- popFrontResultRow(pRuntimeEnv, &pRuntimeEnv->windowResInfo, pQInfo->groupIndex);
-
- if (pQuery->rec.rows > 0) {
- qDebug("QInfo:%p %"PRId64" rows returned from group results, total:%"PRId64"", pQInfo, pQuery->rec.rows, pQuery->rec.total);
-
- // there are not data remains
- if (pRuntimeEnv->windowResInfo.size <= 0) {
- qDebug("QInfo:%p query over, %"PRId64" rows are returned", pQInfo, pQuery->rec.total);
- }
-
- return;
- }
}
+
+ if (pQuery->rec.rows > 0) {
+ qDebug("QInfo:%p %" PRId64 " rows returned from group results, total:%" PRId64 "", pQInfo, pQuery->rec.rows,
+ pQuery->rec.total);
+ }
+
+ // there are not data remains
+ if (pQuery->rec.rows <= 0 || pRuntimeEnv->windowResInfo.size <= pQInfo->groupIndex) {
+ qDebug("QInfo:%p query over, %" PRId64 " rows are returned", pQInfo, pQuery->rec.total);
+ }
+
+ return;
}
}
@@ -6518,13 +6225,13 @@ static int32_t convertQueryMsg(SQueryTableMsg *pQueryMsg, SArray **pTableIdList,
}
for (int32_t i = 0; i < pQueryMsg->numOfGroupCols; ++i) {
- (*groupbyCols)[i].colId = *(int16_t *)pMsg;
+ (*groupbyCols)[i].colId = htons(*(int16_t *)pMsg);
pMsg += sizeof((*groupbyCols)[i].colId);
- (*groupbyCols)[i].colIndex = *(int16_t *)pMsg;
+ (*groupbyCols)[i].colIndex = htons(*(int16_t *)pMsg);
pMsg += sizeof((*groupbyCols)[i].colIndex);
- (*groupbyCols)[i].flag = *(int16_t *)pMsg;
+ (*groupbyCols)[i].flag = htons(*(int16_t *)pMsg);
pMsg += sizeof((*groupbyCols)[i].flag);
memcpy((*groupbyCols)[i].name, pMsg, tListLen(groupbyCols[i]->name));
@@ -7284,6 +6991,8 @@ static void freeQInfo(SQInfo *pQInfo) {
tsdbDestroyTableGroup(&pQInfo->tableGroupInfo);
taosHashCleanup(pQInfo->arrTableIdInfo);
+ taosArrayDestroy(pQInfo->groupResInfo.pRows);
+
pQInfo->signature = 0;
qDebug("QInfo:%p QInfo is freed", pQInfo);
@@ -7703,7 +7412,7 @@ int32_t qDumpRetrieveResult(qinfo_t qinfo, SRetrieveTableRsp **pRsp, int32_t *co
(*pRsp)->completed = 1; // notify no more result to client
} else {
*continueExec = true;
- qDebug("QInfo:%p has more results waits for client retrieve", pQInfo);
+ qDebug("QInfo:%p has more results to retrieve", pQInfo);
}
return pQInfo->code;
@@ -7981,9 +7690,9 @@ void qQueryMgmtNotifyClosed(void* pQMgmt) {
SQueryMgmt* pQueryMgmt = pQMgmt;
qDebug("vgId:%d, set querymgmt closed, wait for all queries cancelled", pQueryMgmt->vgId);
-// pthread_mutex_lock(&pQueryMgmt->lock);
+ pthread_mutex_lock(&pQueryMgmt->lock);
pQueryMgmt->closed = true;
-// pthread_mutex_unlock(&pQueryMgmt->lock);
+ pthread_mutex_unlock(&pQueryMgmt->lock);
taosCacheRefresh(pQueryMgmt->qinfoPool, queryMgmtKillQueryFn);
}
@@ -8021,9 +7730,9 @@ void** qRegisterQInfo(void* pMgmt, uint64_t qInfo) {
return NULL;
}
-// pthread_mutex_lock(&pQueryMgmt->lock);
+ pthread_mutex_lock(&pQueryMgmt->lock);
if (pQueryMgmt->closed) {
-// pthread_mutex_unlock(&pQueryMgmt->lock);
+ pthread_mutex_unlock(&pQueryMgmt->lock);
qError("QInfo:%p failed to add qhandle into cache, since qMgmt is colsing", (void *)qInfo);
terrno = TSDB_CODE_VND_INVALID_VGROUP_ID;
return NULL;
@@ -8031,7 +7740,7 @@ void** qRegisterQInfo(void* pMgmt, uint64_t qInfo) {
TSDB_CACHE_PTR_TYPE handleVal = (TSDB_CACHE_PTR_TYPE) qInfo;
void** handle = taosCachePut(pQueryMgmt->qinfoPool, &handleVal, sizeof(TSDB_CACHE_PTR_TYPE), &qInfo, sizeof(TSDB_CACHE_PTR_TYPE),
(getMaximumIdleDurationSec()*1000));
-// pthread_mutex_unlock(&pQueryMgmt->lock);
+ pthread_mutex_unlock(&pQueryMgmt->lock);
return handle;
}
@@ -8068,6 +7777,4 @@ void** qReleaseQInfo(void* pMgmt, void* pQInfo, bool freeHandle) {
taosCacheRelease(pQueryMgmt->qinfoPool, pQInfo, freeHandle);
return 0;
-}
-
-
+}
\ No newline at end of file
diff --git a/src/query/src/qHistogram.c b/src/query/src/qHistogram.c
index 35e5906d1f..6ae6ede972 100644
--- a/src/query/src/qHistogram.c
+++ b/src/query/src/qHistogram.c
@@ -158,8 +158,8 @@ int32_t tHistogramAdd(SHistogramInfo** pHisto, double val) {
}
#if defined(USE_ARRAYLIST)
- int32_t idx = vnodeHistobinarySearch((*pHisto)->elems, (*pHisto)->numOfEntries, val);
- assert(idx >= 0 && idx <= (*pHisto)->maxEntries);
+ int32_t idx = histoBinarySearch((*pHisto)->elems, (*pHisto)->numOfEntries, val);
+ assert(idx >= 0 && idx <= (*pHisto)->maxEntries && (*pHisto)->elems != NULL);
if ((*pHisto)->elems[idx].val == val && idx >= 0) {
(*pHisto)->elems[idx].num += 1;
@@ -356,7 +356,7 @@ int32_t tHistogramAdd(SHistogramInfo** pHisto, double val) {
return 0;
}
-int32_t vnodeHistobinarySearch(SHistBin* pEntry, int32_t len, double val) {
+int32_t histoBinarySearch(SHistBin* pEntry, int32_t len, double val) {
int32_t end = len - 1;
int32_t start = 0;
@@ -466,7 +466,7 @@ void tHistogramPrint(SHistogramInfo* pHisto) {
*/
int64_t tHistogramSum(SHistogramInfo* pHisto, double v) {
#if defined(USE_ARRAYLIST)
- int32_t slotIdx = vnodeHistobinarySearch(pHisto->elems, pHisto->numOfEntries, v);
+ int32_t slotIdx = histoBinarySearch(pHisto->elems, pHisto->numOfEntries, v);
if (pHisto->elems[slotIdx].val != v) {
slotIdx -= 1;
diff --git a/src/query/src/qParserImpl.c b/src/query/src/qParserImpl.c
index 5afad74db2..4b3a56e4ee 100644
--- a/src/query/src/qParserImpl.c
+++ b/src/query/src/qParserImpl.c
@@ -846,5 +846,6 @@ void setDefaultCreateDbOption(SCreateDBInfo *pDBInfo) {
pDBInfo->keep = NULL;
pDBInfo->update = -1;
+ pDBInfo->cachelast = 0;
memset(&pDBInfo->precision, 0, sizeof(SStrToken));
}
diff --git a/src/query/src/qResultbuf.c b/src/query/src/qResultbuf.c
index bc7243830d..d45e76c2fd 100644
--- a/src/query/src/qResultbuf.c
+++ b/src/query/src/qResultbuf.c
@@ -313,7 +313,7 @@ tFilePage* getNewDataBuf(SDiskbasedResultBuf* pResultBuf, int32_t groupId, int32
// allocate buf
if (availablePage == NULL) {
- pi->pData = calloc(1, pResultBuf->pageSize + POINTER_BYTES);
+ pi->pData = calloc(1, pResultBuf->pageSize + POINTER_BYTES + 2); // add extract bytes in case of zipped buffer increased.
} else {
pi->pData = availablePage;
}
diff --git a/src/query/src/qTokenizer.c b/src/query/src/qTokenizer.c
index 98545c8ef3..e243637333 100644
--- a/src/query/src/qTokenizer.c
+++ b/src/query/src/qTokenizer.c
@@ -238,6 +238,7 @@ static SKeyword keywordTable[] = {
{"SUM_IRATE", TK_SUM_IRATE},
{"AVG_RATE", TK_AVG_RATE},
{"AVG_IRATE", TK_AVG_IRATE},
+ {"CACHELAST", TK_CACHELAST},
};
static const char isIdChar[] = {
diff --git a/src/query/src/qUtil.c b/src/query/src/qUtil.c
index 65ac60e91f..dc01de0f92 100644
--- a/src/query/src/qUtil.c
+++ b/src/query/src/qUtil.c
@@ -20,18 +20,6 @@
#include "qExecutor.h"
#include "qUtil.h"
-static int32_t getResultRowKeyInfo(SResultRow* pResult, int16_t type, char** key, int16_t* bytes) {
- if (type == TSDB_DATA_TYPE_BINARY || type == TSDB_DATA_TYPE_NCHAR) {
- *key = varDataVal(pResult->key);
- *bytes = varDataLen(pResult->key);
- } else {
- *key = (char*) &pResult->win.skey;
- *bytes = tDataTypeDesc[type].nSize;
- }
-
- return 0;
-}
-
int32_t getOutputInterResultBufSize(SQuery* pQuery) {
int32_t size = 0;
@@ -96,78 +84,9 @@ void resetResultRowInfo(SQueryRuntimeEnv *pRuntimeEnv, SResultRowInfo *pResultRo
pResultRowInfo->curIndex = -1;
pResultRowInfo->size = 0;
-
- pResultRowInfo->startTime = TSKEY_INITIAL_VAL;
pResultRowInfo->prevSKey = TSKEY_INITIAL_VAL;
}
-void popFrontResultRow(SQueryRuntimeEnv *pRuntimeEnv, SResultRowInfo *pResultRowInfo, int32_t num) {
- if (pResultRowInfo == NULL || pResultRowInfo->capacity == 0 || pResultRowInfo->size == 0 || num == 0) {
- return;
- }
-
- int32_t numOfClosed = numOfClosedResultRows(pResultRowInfo);
- assert(num >= 0 && num <= numOfClosed);
-
- int16_t type = pResultRowInfo->type;
- int64_t uid = getResultInfoUId(pRuntimeEnv);
-
- char *key = NULL;
- int16_t bytes = -1;
-
- for (int32_t i = 0; i < num; ++i) {
- SResultRow *pResult = pResultRowInfo->pResult[i];
- if (pResult->closed) { // remove the window slot from hash table
- getResultRowKeyInfo(pResult, type, &key, &bytes);
- SET_RES_WINDOW_KEY(pRuntimeEnv->keyBuf, key, bytes, uid);
- taosHashRemove(pRuntimeEnv->pResultRowHashTable, (const char *)pRuntimeEnv->keyBuf, GET_RES_WINDOW_KEY_LEN(bytes));
- } else {
- break;
- }
- }
-
- int32_t remain = pResultRowInfo->size - num;
-
- // clear all the closed windows from the window list
- for (int32_t k = 0; k < remain; ++k) {
- copyResultRow(pRuntimeEnv, pResultRowInfo->pResult[k], pResultRowInfo->pResult[num + k], type);
- }
-
- // move the unclosed window in the front of the window list
- for (int32_t k = remain; k < pResultRowInfo->size; ++k) {
- SResultRow *pWindowRes = pResultRowInfo->pResult[k];
- clearResultRow(pRuntimeEnv, pWindowRes, pResultRowInfo->type);
- }
-
- pResultRowInfo->size = remain;
-
- for (int32_t k = 0; k < pResultRowInfo->size; ++k) {
- SResultRow *pResult = pResultRowInfo->pResult[k];
- getResultRowKeyInfo(pResult, type, &key, &bytes);
- SET_RES_WINDOW_KEY(pRuntimeEnv->keyBuf, key, bytes, uid);
-
- int32_t *p = (int32_t *)taosHashGet(pRuntimeEnv->pResultRowHashTable, (const char *)pRuntimeEnv->keyBuf, GET_RES_WINDOW_KEY_LEN(bytes));
- assert(p != NULL);
-
- int32_t v = (*p - num);
- assert(v >= 0 && v <= pResultRowInfo->size);
-
- SET_RES_WINDOW_KEY(pRuntimeEnv->keyBuf, key, bytes, uid);
- taosHashPut(pRuntimeEnv->pResultRowHashTable, pRuntimeEnv->keyBuf, GET_RES_WINDOW_KEY_LEN(bytes), (char *)&v, sizeof(int32_t));
- }
-
- pResultRowInfo->curIndex = -1;
-}
-
-void clearClosedResultRows(SQueryRuntimeEnv *pRuntimeEnv, SResultRowInfo *pResultRowInfo) {
- if (pResultRowInfo == NULL || pResultRowInfo->capacity == 0 || pResultRowInfo->size == 0) {
- return;
- }
-
- int32_t numOfClosed = numOfClosedResultRows(pResultRowInfo);
- popFrontResultRow(pRuntimeEnv, &pRuntimeEnv->windowResInfo, numOfClosed);
-}
-
int32_t numOfClosedResultRows(SResultRowInfo *pResultRowInfo) {
int32_t i = 0;
while (i < pResultRowInfo->size && pResultRowInfo->pResult[i]->closed) {
@@ -181,45 +100,12 @@ void closeAllResultRows(SResultRowInfo *pResultRowInfo) {
assert(pResultRowInfo->size >= 0 && pResultRowInfo->capacity >= pResultRowInfo->size);
for (int32_t i = 0; i < pResultRowInfo->size; ++i) {
- if (pResultRowInfo->pResult[i]->closed) {
+ SResultRow* pRow = pResultRowInfo->pResult[i];
+ if (pRow->closed) {
continue;
}
- pResultRowInfo->pResult[i]->closed = true;
- }
-}
-
-/*
- * remove the results that are not the FIRST time window that spreads beyond the
- * the last qualified time stamp in case of sliding query, which the sliding time is not equalled to the interval time.
- * NOTE: remove redundant, only when the result set order equals to traverse order
- */
-void removeRedundantResultRows(SResultRowInfo *pResultRowInfo, TSKEY lastKey, int32_t order) {
- assert(pResultRowInfo->size >= 0 && pResultRowInfo->capacity >= pResultRowInfo->size);
- if (pResultRowInfo->size <= 1) {
- return;
- }
-
- // get the result order
- int32_t resultOrder = (pResultRowInfo->pResult[0]->win.skey < pResultRowInfo->pResult[1]->win.skey)? 1:-1;
- if (order != resultOrder) {
- return;
- }
-
- int32_t i = 0;
- if (order == QUERY_ASC_FORWARD_STEP) {
- TSKEY ekey = pResultRowInfo->pResult[i]->win.ekey;
- while (i < pResultRowInfo->size && (ekey < lastKey)) {
- ++i;
- }
- } else if (order == QUERY_DESC_FORWARD_STEP) {
- while (i < pResultRowInfo->size && (pResultRowInfo->pResult[i]->win.skey > lastKey)) {
- ++i;
- }
- }
-
- if (i < pResultRowInfo->size) {
- pResultRowInfo->size = (i + 1);
+ pRow->closed = true;
}
}
@@ -263,47 +149,6 @@ void clearResultRow(SQueryRuntimeEnv *pRuntimeEnv, SResultRow *pResultRow, int16
}
}
-/**
- * The source window result pos attribution of the source window result does not assign to the destination,
- * since the attribute of "Pos" is bound to each window result when the window result is created in the
- * disk-based result buffer.
- */
-void copyResultRow(SQueryRuntimeEnv *pRuntimeEnv, SResultRow *dst, const SResultRow *src, int16_t type) {
- dst->numOfRows = src->numOfRows;
-
- if (type == TSDB_DATA_TYPE_BINARY || type == TSDB_DATA_TYPE_NCHAR) {
- dst->key = realloc(dst->key, varDataTLen(src->key));
- varDataCopy(dst->key, src->key);
- } else {
- dst->win = src->win;
- }
- dst->closed = src->closed;
-
- int32_t nOutputCols = pRuntimeEnv->pQuery->numOfOutput;
-
- for (int32_t i = 0; i < nOutputCols; ++i) {
- SResultRowCellInfo *pDst = getResultCell(pRuntimeEnv, dst, i);
- SResultRowCellInfo *pSrc = getResultCell(pRuntimeEnv, src, i);
-
-// char *buf = pDst->interResultBuf;
- memcpy(pDst, pSrc, sizeof(SResultRowCellInfo) + pRuntimeEnv->pCtx[i].interBufBytes);
-// pDst->interResultBuf = buf; // restore the allocated buffer
-
- // copy the result info struct
-// memcpy(pDst->interResultBuf, pSrc->interResultBuf, pRuntimeEnv->pCtx[i].interBufBytes);
-
- // copy the output buffer data from src to dst, the position info keep unchanged
- tFilePage *dstpage = getResBufPage(pRuntimeEnv->pResultBuf, dst->pageId);
- char * dstBuf = getPosInResultPage(pRuntimeEnv, i, dst, dstpage);
-
- tFilePage *srcpage = getResBufPage(pRuntimeEnv->pResultBuf, src->pageId);
- char * srcBuf = getPosInResultPage(pRuntimeEnv, i, (SResultRow *)src, srcpage);
- size_t s = pRuntimeEnv->pQuery->pExpr1[i].bytes;
-
- memcpy(dstBuf, srcBuf, s);
- }
-}
-
SResultRowCellInfo* getResultCell(SQueryRuntimeEnv* pRuntimeEnv, const SResultRow* pRow, int32_t index) {
assert(index >= 0 && index < pRuntimeEnv->pQuery->numOfOutput);
return (SResultRowCellInfo*)((char*) pRow->pCellInfo + pRuntimeEnv->rowCellInfoOffset[index]);
@@ -383,18 +228,4 @@ void* destroyResultRowPool(SResultRowPool* p) {
tfree(p);
return NULL;
-}
-
-uint64_t getResultInfoUId(SQueryRuntimeEnv* pRuntimeEnv) {
- if (!pRuntimeEnv->stableQuery) {
- return 0; // for simple table query, the uid is always set to be 0;
- }
-
- SQuery* pQuery = pRuntimeEnv->pQuery;
- if (pQuery->interval.interval == 0 || isPointInterpoQuery(pQuery) || pRuntimeEnv->groupbyNormalCol) {
- return 0;
- }
-
- STableId* id = TSDB_TABLEID(pRuntimeEnv->pQuery->current->pTable);
- return id->uid;
}
\ No newline at end of file
diff --git a/src/query/src/sql.c b/src/query/src/sql.c
index fe82db72a6..7c10a4ce6b 100644
--- a/src/query/src/sql.c
+++ b/src/query/src/sql.c
@@ -97,27 +97,27 @@
#endif
/************* Begin control #defines *****************************************/
#define YYCODETYPE unsigned short int
-#define YYNOCODE 276
+#define YYNOCODE 278
#define YYACTIONTYPE unsigned short int
#define ParseTOKENTYPE SStrToken
typedef union {
int yyinit;
ParseTOKENTYPE yy0;
- int yy42;
- SQuerySQL* yy84;
- SCreatedTableInfo yy96;
- SArray* yy131;
- SCreateDBInfo yy148;
- TAOS_FIELD yy163;
- SLimitVal yy284;
- SCreateAcctSQL yy309;
- tSQLExpr* yy420;
- int64_t yy459;
- tSQLExprList* yy478;
- SSubclauseInfo* yy513;
- tVariant yy516;
- SIntervalVal yy530;
- SCreateTableSQL* yy538;
+ SQuerySQL* yy4;
+ SSubclauseInfo* yy13;
+ int yy70;
+ SCreatedTableInfo yy84;
+ SIntervalVal yy222;
+ TAOS_FIELD yy363;
+ tSQLExprList* yy382;
+ int64_t yy387;
+ SArray* yy403;
+ SLimitVal yy404;
+ SCreateTableSQL* yy436;
+ SCreateAcctSQL yy463;
+ SCreateDBInfo yy478;
+ tVariant yy488;
+ tSQLExpr* yy522;
} YYMINORTYPE;
#ifndef YYSTACKDEPTH
#define YYSTACKDEPTH 100
@@ -127,17 +127,17 @@ typedef union {
#define ParseARG_FETCH SSqlInfo* pInfo = yypParser->pInfo
#define ParseARG_STORE yypParser->pInfo = pInfo
#define YYFALLBACK 1
-#define YYNSTATE 257
-#define YYNRULE 236
-#define YYNTOKEN 207
-#define YY_MAX_SHIFT 256
-#define YY_MIN_SHIFTREDUCE 426
-#define YY_MAX_SHIFTREDUCE 661
-#define YY_ERROR_ACTION 662
-#define YY_ACCEPT_ACTION 663
-#define YY_NO_ACTION 664
-#define YY_MIN_REDUCE 665
-#define YY_MAX_REDUCE 900
+#define YYNSTATE 258
+#define YYNRULE 239
+#define YYNTOKEN 208
+#define YY_MAX_SHIFT 257
+#define YY_MIN_SHIFTREDUCE 430
+#define YY_MAX_SHIFTREDUCE 668
+#define YY_ERROR_ACTION 669
+#define YY_ACCEPT_ACTION 670
+#define YY_NO_ACTION 671
+#define YY_MIN_REDUCE 672
+#define YY_MAX_REDUCE 910
/************* End control #defines *******************************************/
/* Define the yytestcase() macro to be a no-op if is not already defined
@@ -203,226 +203,228 @@ typedef union {
** yy_default[] Default action for each state.
**
*********** Begin parsing tables **********************************************/
-#define YY_ACTTAB_COUNT (579)
+#define YY_ACTTAB_COUNT (585)
static const YYACTIONTYPE yy_action[] = {
- /* 0 */ 143, 469, 663, 256, 469, 162, 254, 12, 814, 470,
- /* 10 */ 887, 142, 470, 37, 38, 147, 39, 40, 803, 233,
- /* 20 */ 173, 31, 884, 469, 209, 43, 41, 45, 42, 64,
- /* 30 */ 883, 470, 163, 36, 35, 105, 143, 34, 33, 32,
- /* 40 */ 37, 38, 803, 39, 40, 168, 888, 173, 31, 110,
- /* 50 */ 790, 209, 43, 41, 45, 42, 194, 780, 22, 782,
- /* 60 */ 36, 35, 811, 882, 34, 33, 32, 427, 428, 429,
- /* 70 */ 430, 431, 432, 433, 434, 435, 436, 437, 438, 255,
- /* 80 */ 37, 38, 184, 39, 40, 538, 224, 173, 31, 143,
- /* 90 */ 197, 209, 43, 41, 45, 42, 165, 23, 167, 888,
- /* 100 */ 36, 35, 242, 57, 34, 33, 32, 179, 841, 38,
- /* 110 */ 204, 39, 40, 231, 230, 173, 31, 49, 792, 209,
- /* 120 */ 43, 41, 45, 42, 253, 252, 98, 615, 36, 35,
- /* 130 */ 178, 781, 34, 33, 32, 788, 50, 17, 222, 249,
- /* 140 */ 248, 221, 220, 219, 247, 218, 246, 245, 244, 217,
- /* 150 */ 243, 764, 792, 752, 753, 754, 755, 756, 757, 758,
- /* 160 */ 759, 760, 761, 762, 763, 765, 39, 40, 110, 180,
- /* 170 */ 173, 31, 228, 227, 209, 43, 41, 45, 42, 34,
- /* 180 */ 33, 32, 9, 36, 35, 65, 120, 34, 33, 32,
- /* 190 */ 172, 628, 18, 13, 619, 110, 622, 210, 625, 28,
- /* 200 */ 172, 628, 110, 159, 619, 187, 622, 224, 625, 155,
- /* 210 */ 172, 628, 191, 190, 619, 156, 622, 66, 625, 92,
- /* 220 */ 91, 150, 169, 170, 36, 35, 208, 840, 34, 33,
- /* 230 */ 32, 160, 169, 170, 617, 250, 573, 43, 41, 45,
- /* 240 */ 42, 706, 169, 170, 133, 36, 35, 783, 18, 34,
- /* 250 */ 33, 32, 206, 104, 61, 28, 17, 792, 249, 248,
- /* 260 */ 28, 62, 145, 247, 23, 246, 245, 244, 146, 243,
- /* 270 */ 618, 715, 78, 82, 133, 193, 565, 23, 87, 90,
- /* 280 */ 81, 769, 158, 196, 767, 768, 84, 631, 44, 770,
- /* 290 */ 23, 772, 773, 771, 148, 774, 80, 149, 44, 627,
- /* 300 */ 176, 242, 789, 707, 3, 124, 133, 23, 44, 627,
- /* 310 */ 72, 68, 71, 177, 626, 789, 596, 597, 570, 627,
- /* 320 */ 805, 63, 557, 19, 626, 554, 229, 555, 789, 556,
- /* 330 */ 171, 137, 135, 29, 626, 153, 583, 95, 94, 93,
- /* 340 */ 107, 154, 587, 234, 588, 789, 48, 647, 15, 52,
- /* 350 */ 152, 14, 629, 181, 182, 141, 14, 621, 620, 624,
- /* 360 */ 623, 546, 89, 88, 212, 24, 53, 547, 24, 151,
- /* 370 */ 4, 48, 561, 144, 562, 77, 76, 11, 10, 897,
- /* 380 */ 559, 851, 560, 103, 101, 791, 850, 174, 847, 846,
- /* 390 */ 175, 232, 813, 833, 818, 820, 106, 832, 121, 122,
- /* 400 */ 28, 123, 102, 119, 717, 216, 139, 26, 225, 714,
- /* 410 */ 195, 582, 226, 896, 74, 895, 893, 125, 735, 27,
- /* 420 */ 198, 25, 164, 202, 140, 558, 704, 83, 702, 85,
- /* 430 */ 86, 700, 699, 183, 54, 134, 697, 696, 695, 694,
- /* 440 */ 693, 136, 691, 689, 46, 687, 685, 802, 683, 138,
- /* 450 */ 51, 58, 59, 834, 207, 205, 199, 203, 201, 30,
- /* 460 */ 79, 235, 236, 237, 238, 239, 240, 241, 251, 161,
- /* 470 */ 661, 214, 215, 186, 185, 660, 189, 157, 188, 69,
- /* 480 */ 659, 652, 192, 60, 196, 166, 567, 698, 56, 128,
- /* 490 */ 96, 692, 736, 126, 130, 97, 127, 129, 131, 132,
- /* 500 */ 684, 1, 584, 787, 2, 108, 200, 117, 113, 111,
- /* 510 */ 112, 114, 115, 116, 589, 118, 109, 5, 6, 20,
- /* 520 */ 21, 630, 8, 7, 632, 211, 16, 213, 67, 510,
- /* 530 */ 65, 506, 504, 503, 502, 499, 473, 223, 24, 70,
- /* 540 */ 47, 73, 540, 539, 537, 55, 494, 492, 484, 490,
- /* 550 */ 75, 486, 488, 482, 480, 511, 509, 508, 507, 505,
- /* 560 */ 501, 500, 48, 471, 442, 440, 99, 665, 664, 664,
- /* 570 */ 664, 664, 664, 664, 664, 664, 664, 664, 100,
+ /* 0 */ 143, 473, 143, 23, 670, 257, 165, 545, 824, 474,
+ /* 10 */ 897, 168, 898, 37, 38, 12, 39, 40, 813, 23,
+ /* 20 */ 173, 31, 473, 473, 209, 43, 41, 45, 42, 802,
+ /* 30 */ 474, 474, 163, 36, 35, 231, 230, 34, 33, 32,
+ /* 40 */ 37, 38, 798, 39, 40, 813, 105, 173, 31, 162,
+ /* 50 */ 255, 209, 43, 41, 45, 42, 176, 178, 799, 194,
+ /* 60 */ 36, 35, 233, 821, 34, 33, 32, 431, 432, 433,
+ /* 70 */ 434, 435, 436, 437, 438, 439, 440, 441, 442, 256,
+ /* 80 */ 802, 143, 184, 63, 179, 37, 38, 224, 39, 40,
+ /* 90 */ 167, 898, 173, 31, 800, 29, 209, 43, 41, 45,
+ /* 100 */ 42, 110, 197, 791, 57, 36, 35, 251, 210, 34,
+ /* 110 */ 33, 32, 110, 17, 222, 250, 249, 221, 220, 219,
+ /* 120 */ 248, 218, 247, 246, 245, 217, 244, 243, 622, 772,
+ /* 130 */ 802, 760, 761, 762, 763, 764, 765, 766, 767, 768,
+ /* 140 */ 769, 770, 771, 773, 774, 242, 38, 180, 39, 40,
+ /* 150 */ 228, 227, 173, 31, 110, 18, 209, 43, 41, 45,
+ /* 160 */ 42, 851, 28, 204, 110, 36, 35, 23, 187, 34,
+ /* 170 */ 33, 32, 850, 39, 40, 191, 190, 173, 31, 224,
+ /* 180 */ 624, 209, 43, 41, 45, 42, 34, 33, 32, 9,
+ /* 190 */ 36, 35, 65, 120, 34, 33, 32, 172, 635, 638,
+ /* 200 */ 66, 626, 104, 629, 177, 632, 799, 172, 635, 28,
+ /* 210 */ 13, 626, 206, 629, 61, 632, 625, 172, 635, 142,
+ /* 220 */ 572, 626, 23, 629, 62, 632, 155, 196, 147, 169,
+ /* 230 */ 170, 793, 156, 208, 603, 604, 92, 91, 150, 169,
+ /* 240 */ 170, 894, 713, 580, 17, 133, 250, 249, 893, 169,
+ /* 250 */ 170, 248, 64, 247, 246, 245, 892, 244, 243, 229,
+ /* 260 */ 778, 799, 80, 776, 777, 590, 18, 242, 779, 107,
+ /* 270 */ 781, 782, 780, 28, 783, 784, 43, 41, 45, 42,
+ /* 280 */ 159, 790, 22, 792, 36, 35, 160, 171, 34, 33,
+ /* 290 */ 32, 722, 564, 193, 133, 561, 44, 562, 52, 563,
+ /* 300 */ 158, 254, 253, 98, 36, 35, 44, 634, 34, 33,
+ /* 310 */ 32, 23, 145, 3, 124, 53, 44, 634, 146, 72,
+ /* 320 */ 68, 71, 633, 181, 182, 148, 714, 634, 4, 133,
+ /* 330 */ 78, 82, 633, 137, 135, 149, 87, 90, 81, 95,
+ /* 340 */ 94, 93, 633, 153, 84, 594, 577, 154, 234, 48,
+ /* 350 */ 799, 19, 49, 152, 595, 654, 636, 141, 15, 14,
+ /* 360 */ 14, 628, 627, 631, 630, 553, 212, 151, 554, 24,
+ /* 370 */ 24, 50, 48, 77, 76, 11, 10, 568, 566, 569,
+ /* 380 */ 567, 89, 88, 103, 101, 907, 144, 801, 861, 860,
+ /* 390 */ 174, 857, 856, 175, 823, 232, 565, 828, 830, 106,
+ /* 400 */ 843, 815, 842, 121, 122, 28, 119, 123, 195, 724,
+ /* 410 */ 216, 139, 26, 225, 721, 226, 906, 74, 102, 905,
+ /* 420 */ 903, 125, 742, 27, 25, 140, 711, 83, 589, 709,
+ /* 430 */ 85, 86, 707, 706, 183, 134, 704, 703, 702, 701,
+ /* 440 */ 198, 700, 136, 698, 696, 694, 692, 690, 138, 164,
+ /* 450 */ 58, 54, 59, 202, 51, 844, 46, 812, 207, 205,
+ /* 460 */ 203, 201, 199, 30, 79, 235, 236, 237, 238, 239,
+ /* 470 */ 240, 161, 214, 241, 252, 215, 668, 186, 185, 157,
+ /* 480 */ 69, 667, 188, 189, 666, 659, 192, 196, 166, 574,
+ /* 490 */ 705, 591, 56, 96, 132, 743, 126, 128, 127, 129,
+ /* 500 */ 130, 699, 111, 131, 1, 97, 116, 112, 113, 114,
+ /* 510 */ 691, 797, 60, 117, 115, 118, 2, 20, 108, 200,
+ /* 520 */ 6, 596, 109, 5, 7, 637, 21, 8, 211, 16,
+ /* 530 */ 213, 639, 67, 65, 514, 510, 508, 507, 506, 503,
+ /* 540 */ 477, 223, 70, 47, 73, 75, 24, 547, 546, 544,
+ /* 550 */ 55, 498, 496, 488, 494, 490, 492, 486, 484, 516,
+ /* 560 */ 515, 513, 512, 511, 509, 505, 504, 48, 475, 446,
+ /* 570 */ 444, 672, 671, 671, 671, 671, 671, 671, 671, 671,
+ /* 580 */ 671, 671, 671, 99, 100,
};
static const YYCODETYPE yy_lookahead[] = {
- /* 0 */ 264, 1, 208, 209, 1, 210, 211, 264, 211, 9,
- /* 10 */ 274, 264, 9, 13, 14, 264, 16, 17, 248, 211,
- /* 20 */ 20, 21, 264, 1, 24, 25, 26, 27, 28, 216,
- /* 30 */ 264, 9, 262, 33, 34, 211, 264, 37, 38, 39,
- /* 40 */ 13, 14, 248, 16, 17, 273, 274, 20, 21, 211,
- /* 50 */ 242, 24, 25, 26, 27, 28, 262, 244, 245, 246,
- /* 60 */ 33, 34, 265, 264, 37, 38, 39, 45, 46, 47,
+ /* 0 */ 266, 1, 266, 212, 209, 210, 229, 5, 212, 9,
+ /* 10 */ 276, 275, 276, 13, 14, 266, 16, 17, 250, 212,
+ /* 20 */ 20, 21, 1, 1, 24, 25, 26, 27, 28, 252,
+ /* 30 */ 9, 9, 264, 33, 34, 33, 34, 37, 38, 39,
+ /* 40 */ 13, 14, 251, 16, 17, 250, 212, 20, 21, 211,
+ /* 50 */ 212, 24, 25, 26, 27, 28, 249, 229, 251, 264,
+ /* 60 */ 33, 34, 212, 267, 37, 38, 39, 45, 46, 47,
/* 70 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
- /* 80 */ 13, 14, 60, 16, 17, 5, 76, 20, 21, 264,
- /* 90 */ 266, 24, 25, 26, 27, 28, 228, 211, 273, 274,
- /* 100 */ 33, 34, 78, 103, 37, 38, 39, 66, 270, 14,
- /* 110 */ 272, 16, 17, 33, 34, 20, 21, 104, 250, 24,
- /* 120 */ 25, 26, 27, 28, 63, 64, 65, 100, 33, 34,
- /* 130 */ 228, 0, 37, 38, 39, 249, 123, 85, 86, 87,
- /* 140 */ 88, 89, 90, 91, 92, 93, 94, 95, 96, 97,
- /* 150 */ 98, 227, 250, 229, 230, 231, 232, 233, 234, 235,
- /* 160 */ 236, 237, 238, 239, 240, 241, 16, 17, 211, 128,
- /* 170 */ 20, 21, 131, 132, 24, 25, 26, 27, 28, 37,
- /* 180 */ 38, 39, 99, 33, 34, 102, 103, 37, 38, 39,
- /* 190 */ 1, 2, 99, 44, 5, 211, 7, 15, 9, 106,
- /* 200 */ 1, 2, 211, 264, 5, 127, 7, 76, 9, 60,
- /* 210 */ 1, 2, 134, 135, 5, 66, 7, 216, 9, 70,
- /* 220 */ 71, 72, 33, 34, 33, 34, 37, 270, 37, 38,
- /* 230 */ 39, 264, 33, 34, 1, 228, 37, 25, 26, 27,
- /* 240 */ 28, 215, 33, 34, 218, 33, 34, 246, 99, 37,
- /* 250 */ 38, 39, 268, 99, 270, 106, 85, 250, 87, 88,
- /* 260 */ 106, 270, 264, 92, 211, 94, 95, 96, 264, 98,
- /* 270 */ 37, 215, 61, 62, 218, 126, 100, 211, 67, 68,
- /* 280 */ 69, 227, 133, 107, 230, 231, 75, 105, 99, 235,
- /* 290 */ 211, 237, 238, 239, 264, 241, 73, 264, 99, 110,
- /* 300 */ 247, 78, 249, 215, 61, 62, 218, 211, 99, 110,
- /* 310 */ 67, 68, 69, 247, 125, 249, 116, 117, 104, 110,
- /* 320 */ 248, 251, 2, 109, 125, 5, 247, 7, 249, 9,
- /* 330 */ 59, 61, 62, 263, 125, 264, 100, 67, 68, 69,
- /* 340 */ 104, 264, 100, 247, 100, 249, 104, 100, 104, 104,
- /* 350 */ 264, 104, 100, 33, 34, 264, 104, 5, 5, 7,
- /* 360 */ 7, 100, 73, 74, 100, 104, 121, 100, 104, 264,
- /* 370 */ 99, 104, 5, 264, 7, 129, 130, 129, 130, 250,
- /* 380 */ 5, 243, 7, 61, 62, 250, 243, 243, 243, 243,
- /* 390 */ 243, 243, 211, 271, 211, 211, 211, 271, 211, 211,
- /* 400 */ 106, 211, 59, 252, 211, 211, 211, 211, 211, 211,
- /* 410 */ 248, 110, 211, 211, 211, 211, 211, 211, 211, 211,
- /* 420 */ 267, 211, 267, 267, 211, 105, 211, 211, 211, 211,
- /* 430 */ 211, 211, 211, 211, 120, 211, 211, 211, 211, 211,
- /* 440 */ 211, 211, 211, 211, 119, 211, 211, 261, 211, 211,
- /* 450 */ 122, 212, 212, 212, 114, 118, 111, 113, 112, 124,
- /* 460 */ 84, 83, 49, 80, 82, 53, 81, 79, 76, 212,
- /* 470 */ 5, 212, 212, 5, 136, 5, 5, 212, 136, 216,
- /* 480 */ 5, 86, 127, 104, 107, 1, 100, 212, 108, 220,
- /* 490 */ 213, 212, 226, 225, 221, 213, 224, 223, 222, 219,
- /* 500 */ 212, 217, 100, 248, 214, 99, 99, 254, 258, 260,
- /* 510 */ 259, 257, 256, 255, 100, 253, 99, 99, 115, 104,
- /* 520 */ 104, 100, 99, 115, 105, 101, 99, 101, 73, 9,
- /* 530 */ 102, 5, 5, 5, 5, 5, 77, 15, 104, 73,
- /* 540 */ 16, 130, 5, 5, 100, 99, 5, 5, 5, 5,
- /* 550 */ 130, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- /* 560 */ 5, 5, 104, 77, 59, 58, 21, 0, 275, 275,
- /* 570 */ 275, 275, 275, 275, 275, 275, 275, 275, 21, 275,
- /* 580 */ 275, 275, 275, 275, 275, 275, 275, 275, 275, 275,
- /* 590 */ 275, 275, 275, 275, 275, 275, 275, 275, 275, 275,
- /* 600 */ 275, 275, 275, 275, 275, 275, 275, 275, 275, 275,
- /* 610 */ 275, 275, 275, 275, 275, 275, 275, 275, 275, 275,
- /* 620 */ 275, 275, 275, 275, 275, 275, 275, 275, 275, 275,
- /* 630 */ 275, 275, 275, 275, 275, 275, 275, 275, 275, 275,
- /* 640 */ 275, 275, 275, 275, 275, 275, 275, 275, 275, 275,
- /* 650 */ 275, 275, 275, 275, 275, 275, 275, 275, 275, 275,
- /* 660 */ 275, 275, 275, 275, 275, 275, 275, 275, 275, 275,
- /* 670 */ 275, 275, 275, 275, 275, 275, 275, 275, 275, 275,
- /* 680 */ 275, 275, 275, 275, 275, 275, 275, 275, 275, 275,
- /* 690 */ 275, 275, 275, 275, 275, 275, 275, 275, 275, 275,
- /* 700 */ 275, 275, 275, 275, 275, 275, 275, 275, 275, 275,
- /* 710 */ 275, 275, 275, 275, 275, 275, 275, 275, 275, 275,
- /* 720 */ 275, 275, 275, 275, 275, 275, 275, 275, 275, 275,
- /* 730 */ 275, 275, 275, 275, 275, 275, 275, 275, 275, 275,
- /* 740 */ 275, 275, 275, 275, 275, 275, 275, 275, 275, 275,
- /* 750 */ 275, 275, 275, 275, 275, 275, 275, 275, 275, 275,
- /* 760 */ 275, 275, 275, 275, 275, 275, 275, 275, 275, 275,
- /* 770 */ 275, 275, 275, 275, 275, 275, 275, 275, 275, 275,
- /* 780 */ 275, 275, 275, 275, 275, 275,
+ /* 80 */ 252, 266, 60, 253, 66, 13, 14, 76, 16, 17,
+ /* 90 */ 275, 276, 20, 21, 244, 265, 24, 25, 26, 27,
+ /* 100 */ 28, 212, 268, 0, 104, 33, 34, 229, 15, 37,
+ /* 110 */ 38, 39, 212, 85, 86, 87, 88, 89, 90, 91,
+ /* 120 */ 92, 93, 94, 95, 96, 97, 98, 99, 101, 228,
+ /* 130 */ 252, 230, 231, 232, 233, 234, 235, 236, 237, 238,
+ /* 140 */ 239, 240, 241, 242, 243, 78, 14, 129, 16, 17,
+ /* 150 */ 132, 133, 20, 21, 212, 100, 24, 25, 26, 27,
+ /* 160 */ 28, 272, 107, 274, 212, 33, 34, 212, 128, 37,
+ /* 170 */ 38, 39, 272, 16, 17, 135, 136, 20, 21, 76,
+ /* 180 */ 1, 24, 25, 26, 27, 28, 37, 38, 39, 100,
+ /* 190 */ 33, 34, 103, 104, 37, 38, 39, 1, 2, 106,
+ /* 200 */ 217, 5, 100, 7, 249, 9, 251, 1, 2, 107,
+ /* 210 */ 44, 5, 270, 7, 272, 9, 37, 1, 2, 266,
+ /* 220 */ 101, 5, 212, 7, 272, 9, 60, 108, 266, 33,
+ /* 230 */ 34, 248, 66, 37, 117, 118, 70, 71, 72, 33,
+ /* 240 */ 34, 266, 216, 37, 85, 219, 87, 88, 266, 33,
+ /* 250 */ 34, 92, 217, 94, 95, 96, 266, 98, 99, 249,
+ /* 260 */ 228, 251, 73, 231, 232, 101, 100, 78, 236, 105,
+ /* 270 */ 238, 239, 240, 107, 242, 243, 25, 26, 27, 28,
+ /* 280 */ 266, 246, 247, 248, 33, 34, 266, 59, 37, 38,
+ /* 290 */ 39, 216, 2, 127, 219, 5, 100, 7, 105, 9,
+ /* 300 */ 134, 63, 64, 65, 33, 34, 100, 111, 37, 38,
+ /* 310 */ 39, 212, 266, 61, 62, 122, 100, 111, 266, 67,
+ /* 320 */ 68, 69, 126, 33, 34, 266, 216, 111, 100, 219,
+ /* 330 */ 61, 62, 126, 61, 62, 266, 67, 68, 69, 67,
+ /* 340 */ 68, 69, 126, 266, 75, 101, 105, 266, 249, 105,
+ /* 350 */ 251, 110, 105, 266, 101, 101, 101, 266, 105, 105,
+ /* 360 */ 105, 5, 5, 7, 7, 101, 101, 266, 101, 105,
+ /* 370 */ 105, 124, 105, 130, 131, 130, 131, 5, 5, 7,
+ /* 380 */ 7, 73, 74, 61, 62, 252, 266, 252, 245, 245,
+ /* 390 */ 245, 245, 245, 245, 212, 245, 106, 212, 212, 212,
+ /* 400 */ 273, 250, 273, 212, 212, 107, 254, 212, 250, 212,
+ /* 410 */ 212, 212, 212, 212, 212, 212, 212, 212, 59, 212,
+ /* 420 */ 212, 212, 212, 212, 212, 212, 212, 212, 111, 212,
+ /* 430 */ 212, 212, 212, 212, 212, 212, 212, 212, 212, 212,
+ /* 440 */ 269, 212, 212, 212, 212, 212, 212, 212, 212, 269,
+ /* 450 */ 213, 121, 213, 269, 123, 213, 120, 263, 115, 119,
+ /* 460 */ 114, 113, 112, 125, 84, 83, 49, 80, 82, 53,
+ /* 470 */ 81, 213, 213, 79, 76, 213, 5, 5, 137, 213,
+ /* 480 */ 217, 5, 137, 5, 5, 86, 128, 108, 1, 101,
+ /* 490 */ 213, 101, 109, 214, 220, 227, 226, 221, 225, 224,
+ /* 500 */ 222, 213, 262, 223, 218, 214, 257, 261, 260, 259,
+ /* 510 */ 213, 250, 105, 256, 258, 255, 215, 105, 100, 100,
+ /* 520 */ 116, 101, 100, 100, 116, 101, 105, 100, 102, 100,
+ /* 530 */ 102, 106, 73, 103, 9, 5, 5, 5, 5, 5,
+ /* 540 */ 77, 15, 73, 16, 131, 131, 105, 5, 5, 101,
+ /* 550 */ 100, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ /* 560 */ 5, 5, 5, 5, 5, 5, 5, 105, 77, 59,
+ /* 570 */ 58, 0, 277, 277, 277, 277, 277, 277, 277, 277,
+ /* 580 */ 277, 277, 277, 21, 21, 277, 277, 277, 277, 277,
+ /* 590 */ 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
+ /* 600 */ 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
+ /* 610 */ 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
+ /* 620 */ 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
+ /* 630 */ 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
+ /* 640 */ 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
+ /* 650 */ 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
+ /* 660 */ 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
+ /* 670 */ 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
+ /* 680 */ 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
+ /* 690 */ 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
+ /* 700 */ 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
+ /* 710 */ 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
+ /* 720 */ 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
+ /* 730 */ 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
+ /* 740 */ 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
+ /* 750 */ 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
+ /* 760 */ 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
+ /* 770 */ 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
+ /* 780 */ 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
+ /* 790 */ 277, 277, 277,
};
-#define YY_SHIFT_COUNT (256)
+#define YY_SHIFT_COUNT (257)
#define YY_SHIFT_MIN (0)
-#define YY_SHIFT_MAX (567)
+#define YY_SHIFT_MAX (571)
static const unsigned short int yy_shift_ofst[] = {
- /* 0 */ 149, 52, 171, 10, 189, 209, 3, 3, 3, 3,
- /* 10 */ 3, 3, 0, 22, 209, 320, 320, 320, 93, 3,
- /* 20 */ 3, 3, 131, 3, 3, 223, 24, 24, 579, 199,
- /* 30 */ 209, 209, 209, 209, 209, 209, 209, 209, 209, 209,
- /* 40 */ 209, 209, 209, 209, 209, 209, 209, 320, 320, 80,
- /* 50 */ 80, 80, 80, 80, 80, 80, 154, 3, 3, 3,
- /* 60 */ 3, 200, 200, 214, 3, 3, 3, 3, 3, 3,
- /* 70 */ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- /* 80 */ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- /* 90 */ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- /* 100 */ 3, 3, 3, 3, 294, 343, 343, 301, 301, 301,
- /* 110 */ 343, 314, 328, 325, 340, 337, 344, 346, 345, 335,
- /* 120 */ 294, 343, 343, 343, 10, 343, 376, 378, 413, 383,
- /* 130 */ 382, 412, 385, 388, 343, 392, 343, 392, 343, 579,
- /* 140 */ 579, 27, 67, 67, 67, 95, 150, 212, 212, 212,
- /* 150 */ 211, 191, 191, 191, 191, 243, 270, 41, 78, 142,
- /* 160 */ 142, 83, 61, 176, 236, 242, 244, 247, 252, 352,
- /* 170 */ 353, 233, 271, 182, 13, 245, 261, 264, 267, 246,
- /* 180 */ 248, 367, 375, 289, 322, 465, 338, 468, 470, 342,
- /* 190 */ 471, 475, 395, 355, 377, 386, 380, 379, 402, 406,
- /* 200 */ 484, 407, 414, 417, 415, 403, 416, 408, 421, 418,
- /* 210 */ 419, 423, 424, 427, 426, 428, 455, 520, 526, 527,
- /* 220 */ 528, 529, 530, 459, 522, 466, 524, 411, 420, 434,
- /* 230 */ 537, 538, 444, 446, 434, 541, 542, 543, 544, 546,
- /* 240 */ 547, 548, 549, 550, 551, 552, 553, 554, 555, 556,
- /* 250 */ 458, 486, 545, 557, 505, 507, 567,
+ /* 0 */ 166, 28, 159, 11, 196, 216, 21, 21, 21, 21,
+ /* 10 */ 21, 21, 0, 22, 216, 290, 290, 290, 55, 21,
+ /* 20 */ 21, 21, 103, 21, 21, 189, 67, 67, 585, 206,
+ /* 30 */ 216, 216, 216, 216, 216, 216, 216, 216, 216, 216,
+ /* 40 */ 216, 216, 216, 216, 216, 216, 216, 290, 290, 2,
+ /* 50 */ 2, 2, 2, 2, 2, 2, 102, 21, 21, 21,
+ /* 60 */ 21, 117, 117, 241, 21, 21, 21, 21, 21, 21,
+ /* 70 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ /* 80 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ /* 90 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ /* 100 */ 21, 21, 21, 21, 298, 359, 359, 317, 317, 317,
+ /* 110 */ 359, 330, 331, 336, 343, 340, 346, 348, 350, 338,
+ /* 120 */ 298, 359, 359, 359, 11, 359, 380, 382, 417, 387,
+ /* 130 */ 386, 416, 389, 394, 359, 398, 359, 398, 359, 585,
+ /* 140 */ 585, 27, 72, 72, 72, 132, 157, 251, 251, 251,
+ /* 150 */ 269, 271, 271, 271, 271, 252, 272, 18, 40, 149,
+ /* 160 */ 149, 89, 238, 119, 164, 244, 253, 254, 255, 356,
+ /* 170 */ 357, 179, 228, 93, 247, 193, 264, 265, 267, 243,
+ /* 180 */ 245, 372, 373, 308, 322, 471, 341, 472, 476, 345,
+ /* 190 */ 478, 479, 399, 358, 379, 388, 383, 407, 390, 418,
+ /* 200 */ 487, 419, 420, 422, 412, 404, 421, 408, 424, 423,
+ /* 210 */ 425, 427, 426, 429, 428, 430, 459, 525, 530, 531,
+ /* 220 */ 532, 533, 534, 463, 526, 469, 527, 413, 414, 441,
+ /* 230 */ 542, 543, 448, 450, 441, 546, 547, 548, 549, 550,
+ /* 240 */ 551, 552, 553, 554, 555, 556, 557, 558, 559, 560,
+ /* 250 */ 561, 462, 491, 562, 563, 510, 512, 571,
};
#define YY_REDUCE_COUNT (140)
-#define YY_REDUCE_MIN (-264)
-#define YY_REDUCE_MAX (290)
+#define YY_REDUCE_MIN (-266)
+#define YY_REDUCE_MAX (301)
static const short yy_reduce_ofst[] = {
- /* 0 */ -206, -76, 54, -187, -228, -175, -162, -16, 53, 66,
- /* 10 */ 79, 96, -203, -205, -264, -132, -98, 7, -230, -176,
- /* 20 */ -43, -9, 1, -192, -114, 26, 56, 88, 70, -257,
- /* 30 */ -253, -249, -242, -234, -201, -61, -33, -2, 4, 30,
- /* 40 */ 33, 71, 77, 86, 91, 105, 109, 129, 135, 138,
- /* 50 */ 143, 144, 145, 146, 147, 148, 72, 181, 183, 184,
- /* 60 */ 185, 122, 126, 151, 187, 188, 190, 193, 194, 195,
- /* 70 */ 196, 197, 198, 201, 202, 203, 204, 205, 206, 207,
- /* 80 */ 208, 210, 213, 215, 216, 217, 218, 219, 220, 221,
- /* 90 */ 222, 224, 225, 226, 227, 228, 229, 230, 231, 232,
- /* 100 */ 234, 235, 237, 238, 162, 239, 240, 153, 155, 156,
- /* 110 */ 241, 186, 249, 251, 250, 254, 256, 258, 253, 262,
- /* 120 */ 255, 257, 259, 260, 263, 265, 266, 268, 272, 269,
- /* 130 */ 274, 273, 276, 280, 275, 277, 279, 282, 288, 284,
- /* 140 */ 290,
+ /* 0 */ -205, -99, 32, 35, -264, -185, -111, -58, -193, -45,
+ /* 10 */ 10, 99, -204, -162, -266, -223, -172, -122, -232, -166,
+ /* 20 */ -100, -48, -17, -150, -209, 26, 75, 110, -170, -251,
+ /* 30 */ -47, -38, -25, -18, -10, 14, 20, 46, 52, 59,
+ /* 40 */ 69, 77, 81, 87, 91, 101, 120, 133, 135, 143,
+ /* 50 */ 144, 145, 146, 147, 148, 150, 151, 182, 185, 186,
+ /* 60 */ 187, 127, 129, 152, 191, 192, 195, 197, 198, 199,
+ /* 70 */ 200, 201, 202, 203, 204, 205, 207, 208, 209, 210,
+ /* 80 */ 211, 212, 213, 214, 215, 217, 218, 219, 220, 221,
+ /* 90 */ 222, 223, 224, 225, 226, 227, 229, 230, 231, 232,
+ /* 100 */ 233, 234, 235, 236, 158, 237, 239, 171, 180, 184,
+ /* 110 */ 242, 194, 240, 246, 248, 250, 256, 249, 257, 260,
+ /* 120 */ 261, 258, 259, 262, 263, 266, 268, 270, 273, 276,
+ /* 130 */ 275, 278, 280, 274, 277, 279, 288, 291, 297, 286,
+ /* 140 */ 301,
};
static const YYACTIONTYPE yy_default[] = {
- /* 0 */ 662, 716, 705, 713, 890, 890, 662, 662, 662, 662,
- /* 10 */ 662, 662, 815, 680, 890, 662, 662, 662, 662, 662,
- /* 20 */ 662, 662, 713, 662, 662, 718, 718, 718, 810, 662,
- /* 30 */ 662, 662, 662, 662, 662, 662, 662, 662, 662, 662,
- /* 40 */ 662, 662, 662, 662, 662, 662, 662, 662, 662, 662,
- /* 50 */ 662, 662, 662, 662, 662, 662, 662, 662, 817, 819,
- /* 60 */ 662, 837, 837, 808, 662, 662, 662, 662, 662, 662,
- /* 70 */ 662, 662, 662, 662, 662, 662, 662, 662, 662, 662,
- /* 80 */ 662, 662, 662, 703, 662, 701, 662, 662, 662, 662,
- /* 90 */ 662, 662, 662, 662, 662, 662, 662, 662, 690, 662,
- /* 100 */ 662, 662, 662, 662, 662, 682, 682, 662, 662, 662,
- /* 110 */ 682, 844, 848, 842, 830, 838, 829, 825, 824, 852,
- /* 120 */ 662, 682, 682, 682, 713, 682, 734, 732, 730, 722,
- /* 130 */ 728, 724, 726, 720, 682, 711, 682, 711, 682, 751,
- /* 140 */ 766, 662, 853, 889, 843, 879, 878, 885, 877, 876,
- /* 150 */ 662, 872, 873, 875, 874, 662, 662, 662, 662, 881,
- /* 160 */ 880, 662, 662, 662, 662, 662, 662, 662, 662, 662,
- /* 170 */ 662, 662, 855, 662, 849, 845, 662, 662, 662, 662,
- /* 180 */ 662, 662, 662, 662, 662, 662, 662, 662, 662, 662,
- /* 190 */ 662, 662, 662, 662, 807, 662, 662, 816, 662, 662,
- /* 200 */ 662, 662, 662, 662, 839, 662, 831, 662, 662, 662,
- /* 210 */ 662, 662, 784, 662, 662, 662, 662, 662, 662, 662,
- /* 220 */ 662, 662, 662, 662, 662, 662, 662, 662, 662, 894,
- /* 230 */ 662, 662, 662, 775, 892, 662, 662, 662, 662, 662,
- /* 240 */ 662, 662, 662, 662, 662, 662, 662, 662, 662, 662,
- /* 250 */ 737, 662, 688, 686, 662, 678, 662,
+ /* 0 */ 669, 723, 712, 720, 900, 900, 669, 669, 669, 669,
+ /* 10 */ 669, 669, 825, 687, 900, 669, 669, 669, 669, 669,
+ /* 20 */ 669, 669, 720, 669, 669, 725, 725, 725, 820, 669,
+ /* 30 */ 669, 669, 669, 669, 669, 669, 669, 669, 669, 669,
+ /* 40 */ 669, 669, 669, 669, 669, 669, 669, 669, 669, 669,
+ /* 50 */ 669, 669, 669, 669, 669, 669, 669, 669, 827, 829,
+ /* 60 */ 669, 847, 847, 818, 669, 669, 669, 669, 669, 669,
+ /* 70 */ 669, 669, 669, 669, 669, 669, 669, 669, 669, 669,
+ /* 80 */ 669, 669, 669, 710, 669, 708, 669, 669, 669, 669,
+ /* 90 */ 669, 669, 669, 669, 669, 669, 669, 669, 697, 669,
+ /* 100 */ 669, 669, 669, 669, 669, 689, 689, 669, 669, 669,
+ /* 110 */ 689, 854, 858, 852, 840, 848, 839, 835, 834, 862,
+ /* 120 */ 669, 689, 689, 689, 720, 689, 741, 739, 737, 729,
+ /* 130 */ 735, 731, 733, 727, 689, 718, 689, 718, 689, 759,
+ /* 140 */ 775, 669, 863, 899, 853, 889, 888, 895, 887, 886,
+ /* 150 */ 669, 882, 883, 885, 884, 669, 669, 669, 669, 891,
+ /* 160 */ 890, 669, 669, 669, 669, 669, 669, 669, 669, 669,
+ /* 170 */ 669, 669, 865, 669, 859, 855, 669, 669, 669, 669,
+ /* 180 */ 669, 669, 669, 669, 669, 669, 669, 669, 669, 669,
+ /* 190 */ 669, 669, 669, 669, 817, 669, 669, 826, 669, 669,
+ /* 200 */ 669, 669, 669, 669, 849, 669, 841, 669, 669, 669,
+ /* 210 */ 669, 669, 794, 669, 669, 669, 669, 669, 669, 669,
+ /* 220 */ 669, 669, 669, 669, 669, 669, 669, 669, 669, 904,
+ /* 230 */ 669, 669, 669, 785, 902, 669, 669, 669, 669, 669,
+ /* 240 */ 669, 669, 669, 669, 669, 669, 669, 669, 669, 669,
+ /* 250 */ 669, 744, 669, 695, 693, 669, 685, 669,
};
/********** End of lemon-generated parsing tables *****************************/
@@ -541,6 +543,7 @@ static const YYCODETYPE yyFallback[] = {
0, /* COMP => nothing */
0, /* PRECISION => nothing */
0, /* UPDATE => nothing */
+ 0, /* CACHELAST => nothing */
0, /* LP => nothing */
0, /* RP => nothing */
0, /* TAGS => nothing */
@@ -834,182 +837,184 @@ static const char *const yyTokenName[] = {
/* 96 */ "COMP",
/* 97 */ "PRECISION",
/* 98 */ "UPDATE",
- /* 99 */ "LP",
- /* 100 */ "RP",
- /* 101 */ "TAGS",
- /* 102 */ "USING",
- /* 103 */ "AS",
- /* 104 */ "COMMA",
- /* 105 */ "NULL",
- /* 106 */ "SELECT",
- /* 107 */ "UNION",
- /* 108 */ "ALL",
- /* 109 */ "FROM",
- /* 110 */ "VARIABLE",
- /* 111 */ "INTERVAL",
- /* 112 */ "FILL",
- /* 113 */ "SLIDING",
- /* 114 */ "ORDER",
- /* 115 */ "BY",
- /* 116 */ "ASC",
- /* 117 */ "DESC",
- /* 118 */ "GROUP",
- /* 119 */ "HAVING",
- /* 120 */ "LIMIT",
- /* 121 */ "OFFSET",
- /* 122 */ "SLIMIT",
- /* 123 */ "SOFFSET",
- /* 124 */ "WHERE",
- /* 125 */ "NOW",
- /* 126 */ "RESET",
- /* 127 */ "QUERY",
- /* 128 */ "ADD",
- /* 129 */ "COLUMN",
- /* 130 */ "TAG",
- /* 131 */ "CHANGE",
- /* 132 */ "SET",
- /* 133 */ "KILL",
- /* 134 */ "CONNECTION",
- /* 135 */ "STREAM",
- /* 136 */ "COLON",
- /* 137 */ "ABORT",
- /* 138 */ "AFTER",
- /* 139 */ "ATTACH",
- /* 140 */ "BEFORE",
- /* 141 */ "BEGIN",
- /* 142 */ "CASCADE",
- /* 143 */ "CLUSTER",
- /* 144 */ "CONFLICT",
- /* 145 */ "COPY",
- /* 146 */ "DEFERRED",
- /* 147 */ "DELIMITERS",
- /* 148 */ "DETACH",
- /* 149 */ "EACH",
- /* 150 */ "END",
- /* 151 */ "EXPLAIN",
- /* 152 */ "FAIL",
- /* 153 */ "FOR",
- /* 154 */ "IGNORE",
- /* 155 */ "IMMEDIATE",
- /* 156 */ "INITIALLY",
- /* 157 */ "INSTEAD",
- /* 158 */ "MATCH",
- /* 159 */ "KEY",
- /* 160 */ "OF",
- /* 161 */ "RAISE",
- /* 162 */ "REPLACE",
- /* 163 */ "RESTRICT",
- /* 164 */ "ROW",
- /* 165 */ "STATEMENT",
- /* 166 */ "TRIGGER",
- /* 167 */ "VIEW",
- /* 168 */ "COUNT",
- /* 169 */ "SUM",
- /* 170 */ "AVG",
- /* 171 */ "MIN",
- /* 172 */ "MAX",
- /* 173 */ "FIRST",
- /* 174 */ "LAST",
- /* 175 */ "TOP",
- /* 176 */ "BOTTOM",
- /* 177 */ "STDDEV",
- /* 178 */ "PERCENTILE",
- /* 179 */ "APERCENTILE",
- /* 180 */ "LEASTSQUARES",
- /* 181 */ "HISTOGRAM",
- /* 182 */ "DIFF",
- /* 183 */ "SPREAD",
- /* 184 */ "TWA",
- /* 185 */ "INTERP",
- /* 186 */ "LAST_ROW",
- /* 187 */ "RATE",
- /* 188 */ "IRATE",
- /* 189 */ "SUM_RATE",
- /* 190 */ "SUM_IRATE",
- /* 191 */ "AVG_RATE",
- /* 192 */ "AVG_IRATE",
- /* 193 */ "TBID",
- /* 194 */ "SEMI",
- /* 195 */ "NONE",
- /* 196 */ "PREV",
- /* 197 */ "LINEAR",
- /* 198 */ "IMPORT",
- /* 199 */ "METRIC",
- /* 200 */ "TBNAME",
- /* 201 */ "JOIN",
- /* 202 */ "METRICS",
- /* 203 */ "STABLE",
- /* 204 */ "INSERT",
- /* 205 */ "INTO",
- /* 206 */ "VALUES",
- /* 207 */ "error",
- /* 208 */ "program",
- /* 209 */ "cmd",
- /* 210 */ "dbPrefix",
- /* 211 */ "ids",
- /* 212 */ "cpxName",
- /* 213 */ "ifexists",
- /* 214 */ "alter_db_optr",
- /* 215 */ "acct_optr",
- /* 216 */ "ifnotexists",
- /* 217 */ "db_optr",
- /* 218 */ "pps",
- /* 219 */ "tseries",
- /* 220 */ "dbs",
- /* 221 */ "streams",
- /* 222 */ "storage",
- /* 223 */ "qtime",
- /* 224 */ "users",
- /* 225 */ "conns",
- /* 226 */ "state",
- /* 227 */ "keep",
- /* 228 */ "tagitemlist",
- /* 229 */ "cache",
- /* 230 */ "replica",
- /* 231 */ "quorum",
- /* 232 */ "days",
- /* 233 */ "minrows",
- /* 234 */ "maxrows",
- /* 235 */ "blocks",
- /* 236 */ "ctime",
- /* 237 */ "wal",
- /* 238 */ "fsync",
- /* 239 */ "comp",
- /* 240 */ "prec",
- /* 241 */ "update",
- /* 242 */ "typename",
- /* 243 */ "signed",
- /* 244 */ "create_table_args",
- /* 245 */ "create_table_list",
- /* 246 */ "create_from_stable",
- /* 247 */ "columnlist",
- /* 248 */ "select",
- /* 249 */ "column",
- /* 250 */ "tagitem",
- /* 251 */ "selcollist",
- /* 252 */ "from",
- /* 253 */ "where_opt",
- /* 254 */ "interval_opt",
- /* 255 */ "fill_opt",
- /* 256 */ "sliding_opt",
- /* 257 */ "groupby_opt",
- /* 258 */ "orderby_opt",
- /* 259 */ "having_opt",
- /* 260 */ "slimit_opt",
- /* 261 */ "limit_opt",
- /* 262 */ "union",
- /* 263 */ "sclp",
- /* 264 */ "expr",
- /* 265 */ "as",
- /* 266 */ "tablelist",
- /* 267 */ "tmvar",
- /* 268 */ "sortlist",
- /* 269 */ "sortitem",
- /* 270 */ "item",
- /* 271 */ "sortorder",
- /* 272 */ "grouplist",
- /* 273 */ "exprlist",
- /* 274 */ "expritem",
+ /* 99 */ "CACHELAST",
+ /* 100 */ "LP",
+ /* 101 */ "RP",
+ /* 102 */ "TAGS",
+ /* 103 */ "USING",
+ /* 104 */ "AS",
+ /* 105 */ "COMMA",
+ /* 106 */ "NULL",
+ /* 107 */ "SELECT",
+ /* 108 */ "UNION",
+ /* 109 */ "ALL",
+ /* 110 */ "FROM",
+ /* 111 */ "VARIABLE",
+ /* 112 */ "INTERVAL",
+ /* 113 */ "FILL",
+ /* 114 */ "SLIDING",
+ /* 115 */ "ORDER",
+ /* 116 */ "BY",
+ /* 117 */ "ASC",
+ /* 118 */ "DESC",
+ /* 119 */ "GROUP",
+ /* 120 */ "HAVING",
+ /* 121 */ "LIMIT",
+ /* 122 */ "OFFSET",
+ /* 123 */ "SLIMIT",
+ /* 124 */ "SOFFSET",
+ /* 125 */ "WHERE",
+ /* 126 */ "NOW",
+ /* 127 */ "RESET",
+ /* 128 */ "QUERY",
+ /* 129 */ "ADD",
+ /* 130 */ "COLUMN",
+ /* 131 */ "TAG",
+ /* 132 */ "CHANGE",
+ /* 133 */ "SET",
+ /* 134 */ "KILL",
+ /* 135 */ "CONNECTION",
+ /* 136 */ "STREAM",
+ /* 137 */ "COLON",
+ /* 138 */ "ABORT",
+ /* 139 */ "AFTER",
+ /* 140 */ "ATTACH",
+ /* 141 */ "BEFORE",
+ /* 142 */ "BEGIN",
+ /* 143 */ "CASCADE",
+ /* 144 */ "CLUSTER",
+ /* 145 */ "CONFLICT",
+ /* 146 */ "COPY",
+ /* 147 */ "DEFERRED",
+ /* 148 */ "DELIMITERS",
+ /* 149 */ "DETACH",
+ /* 150 */ "EACH",
+ /* 151 */ "END",
+ /* 152 */ "EXPLAIN",
+ /* 153 */ "FAIL",
+ /* 154 */ "FOR",
+ /* 155 */ "IGNORE",
+ /* 156 */ "IMMEDIATE",
+ /* 157 */ "INITIALLY",
+ /* 158 */ "INSTEAD",
+ /* 159 */ "MATCH",
+ /* 160 */ "KEY",
+ /* 161 */ "OF",
+ /* 162 */ "RAISE",
+ /* 163 */ "REPLACE",
+ /* 164 */ "RESTRICT",
+ /* 165 */ "ROW",
+ /* 166 */ "STATEMENT",
+ /* 167 */ "TRIGGER",
+ /* 168 */ "VIEW",
+ /* 169 */ "COUNT",
+ /* 170 */ "SUM",
+ /* 171 */ "AVG",
+ /* 172 */ "MIN",
+ /* 173 */ "MAX",
+ /* 174 */ "FIRST",
+ /* 175 */ "LAST",
+ /* 176 */ "TOP",
+ /* 177 */ "BOTTOM",
+ /* 178 */ "STDDEV",
+ /* 179 */ "PERCENTILE",
+ /* 180 */ "APERCENTILE",
+ /* 181 */ "LEASTSQUARES",
+ /* 182 */ "HISTOGRAM",
+ /* 183 */ "DIFF",
+ /* 184 */ "SPREAD",
+ /* 185 */ "TWA",
+ /* 186 */ "INTERP",
+ /* 187 */ "LAST_ROW",
+ /* 188 */ "RATE",
+ /* 189 */ "IRATE",
+ /* 190 */ "SUM_RATE",
+ /* 191 */ "SUM_IRATE",
+ /* 192 */ "AVG_RATE",
+ /* 193 */ "AVG_IRATE",
+ /* 194 */ "TBID",
+ /* 195 */ "SEMI",
+ /* 196 */ "NONE",
+ /* 197 */ "PREV",
+ /* 198 */ "LINEAR",
+ /* 199 */ "IMPORT",
+ /* 200 */ "METRIC",
+ /* 201 */ "TBNAME",
+ /* 202 */ "JOIN",
+ /* 203 */ "METRICS",
+ /* 204 */ "STABLE",
+ /* 205 */ "INSERT",
+ /* 206 */ "INTO",
+ /* 207 */ "VALUES",
+ /* 208 */ "error",
+ /* 209 */ "program",
+ /* 210 */ "cmd",
+ /* 211 */ "dbPrefix",
+ /* 212 */ "ids",
+ /* 213 */ "cpxName",
+ /* 214 */ "ifexists",
+ /* 215 */ "alter_db_optr",
+ /* 216 */ "acct_optr",
+ /* 217 */ "ifnotexists",
+ /* 218 */ "db_optr",
+ /* 219 */ "pps",
+ /* 220 */ "tseries",
+ /* 221 */ "dbs",
+ /* 222 */ "streams",
+ /* 223 */ "storage",
+ /* 224 */ "qtime",
+ /* 225 */ "users",
+ /* 226 */ "conns",
+ /* 227 */ "state",
+ /* 228 */ "keep",
+ /* 229 */ "tagitemlist",
+ /* 230 */ "cache",
+ /* 231 */ "replica",
+ /* 232 */ "quorum",
+ /* 233 */ "days",
+ /* 234 */ "minrows",
+ /* 235 */ "maxrows",
+ /* 236 */ "blocks",
+ /* 237 */ "ctime",
+ /* 238 */ "wal",
+ /* 239 */ "fsync",
+ /* 240 */ "comp",
+ /* 241 */ "prec",
+ /* 242 */ "update",
+ /* 243 */ "cachelast",
+ /* 244 */ "typename",
+ /* 245 */ "signed",
+ /* 246 */ "create_table_args",
+ /* 247 */ "create_table_list",
+ /* 248 */ "create_from_stable",
+ /* 249 */ "columnlist",
+ /* 250 */ "select",
+ /* 251 */ "column",
+ /* 252 */ "tagitem",
+ /* 253 */ "selcollist",
+ /* 254 */ "from",
+ /* 255 */ "where_opt",
+ /* 256 */ "interval_opt",
+ /* 257 */ "fill_opt",
+ /* 258 */ "sliding_opt",
+ /* 259 */ "groupby_opt",
+ /* 260 */ "orderby_opt",
+ /* 261 */ "having_opt",
+ /* 262 */ "slimit_opt",
+ /* 263 */ "limit_opt",
+ /* 264 */ "union",
+ /* 265 */ "sclp",
+ /* 266 */ "expr",
+ /* 267 */ "as",
+ /* 268 */ "tablelist",
+ /* 269 */ "tmvar",
+ /* 270 */ "sortlist",
+ /* 271 */ "sortitem",
+ /* 272 */ "item",
+ /* 273 */ "sortorder",
+ /* 274 */ "grouplist",
+ /* 275 */ "exprlist",
+ /* 276 */ "expritem",
};
#endif /* defined(YYCOVERAGE) || !defined(NDEBUG) */
@@ -1103,156 +1108,159 @@ static const char *const yyRuleName[] = {
/* 83 */ "comp ::= COMP INTEGER",
/* 84 */ "prec ::= PRECISION STRING",
/* 85 */ "update ::= UPDATE INTEGER",
- /* 86 */ "db_optr ::=",
- /* 87 */ "db_optr ::= db_optr cache",
- /* 88 */ "db_optr ::= db_optr replica",
- /* 89 */ "db_optr ::= db_optr quorum",
- /* 90 */ "db_optr ::= db_optr days",
- /* 91 */ "db_optr ::= db_optr minrows",
- /* 92 */ "db_optr ::= db_optr maxrows",
- /* 93 */ "db_optr ::= db_optr blocks",
- /* 94 */ "db_optr ::= db_optr ctime",
- /* 95 */ "db_optr ::= db_optr wal",
- /* 96 */ "db_optr ::= db_optr fsync",
- /* 97 */ "db_optr ::= db_optr comp",
- /* 98 */ "db_optr ::= db_optr prec",
- /* 99 */ "db_optr ::= db_optr keep",
- /* 100 */ "db_optr ::= db_optr update",
- /* 101 */ "alter_db_optr ::=",
- /* 102 */ "alter_db_optr ::= alter_db_optr replica",
- /* 103 */ "alter_db_optr ::= alter_db_optr quorum",
- /* 104 */ "alter_db_optr ::= alter_db_optr keep",
- /* 105 */ "alter_db_optr ::= alter_db_optr blocks",
- /* 106 */ "alter_db_optr ::= alter_db_optr comp",
- /* 107 */ "alter_db_optr ::= alter_db_optr wal",
- /* 108 */ "alter_db_optr ::= alter_db_optr fsync",
- /* 109 */ "alter_db_optr ::= alter_db_optr update",
- /* 110 */ "typename ::= ids",
- /* 111 */ "typename ::= ids LP signed RP",
- /* 112 */ "signed ::= INTEGER",
- /* 113 */ "signed ::= PLUS INTEGER",
- /* 114 */ "signed ::= MINUS INTEGER",
- /* 115 */ "cmd ::= CREATE TABLE create_table_args",
- /* 116 */ "cmd ::= CREATE TABLE create_table_list",
- /* 117 */ "create_table_list ::= create_from_stable",
- /* 118 */ "create_table_list ::= create_table_list create_from_stable",
- /* 119 */ "create_table_args ::= ifnotexists ids cpxName LP columnlist RP",
- /* 120 */ "create_table_args ::= ifnotexists ids cpxName LP columnlist RP TAGS LP columnlist RP",
- /* 121 */ "create_from_stable ::= ifnotexists ids cpxName USING ids cpxName TAGS LP tagitemlist RP",
- /* 122 */ "create_table_args ::= ifnotexists ids cpxName AS select",
- /* 123 */ "columnlist ::= columnlist COMMA column",
- /* 124 */ "columnlist ::= column",
- /* 125 */ "column ::= ids typename",
- /* 126 */ "tagitemlist ::= tagitemlist COMMA tagitem",
- /* 127 */ "tagitemlist ::= tagitem",
- /* 128 */ "tagitem ::= INTEGER",
- /* 129 */ "tagitem ::= FLOAT",
- /* 130 */ "tagitem ::= STRING",
- /* 131 */ "tagitem ::= BOOL",
- /* 132 */ "tagitem ::= NULL",
- /* 133 */ "tagitem ::= MINUS INTEGER",
- /* 134 */ "tagitem ::= MINUS FLOAT",
- /* 135 */ "tagitem ::= PLUS INTEGER",
- /* 136 */ "tagitem ::= PLUS FLOAT",
- /* 137 */ "select ::= SELECT selcollist from where_opt interval_opt fill_opt sliding_opt groupby_opt orderby_opt having_opt slimit_opt limit_opt",
- /* 138 */ "union ::= select",
- /* 139 */ "union ::= LP union RP",
- /* 140 */ "union ::= union UNION ALL select",
- /* 141 */ "union ::= union UNION ALL LP select RP",
- /* 142 */ "cmd ::= union",
- /* 143 */ "select ::= SELECT selcollist",
- /* 144 */ "sclp ::= selcollist COMMA",
- /* 145 */ "sclp ::=",
- /* 146 */ "selcollist ::= sclp expr as",
- /* 147 */ "selcollist ::= sclp STAR",
- /* 148 */ "as ::= AS ids",
- /* 149 */ "as ::= ids",
- /* 150 */ "as ::=",
- /* 151 */ "from ::= FROM tablelist",
- /* 152 */ "tablelist ::= ids cpxName",
- /* 153 */ "tablelist ::= ids cpxName ids",
- /* 154 */ "tablelist ::= tablelist COMMA ids cpxName",
- /* 155 */ "tablelist ::= tablelist COMMA ids cpxName ids",
- /* 156 */ "tmvar ::= VARIABLE",
- /* 157 */ "interval_opt ::= INTERVAL LP tmvar RP",
- /* 158 */ "interval_opt ::= INTERVAL LP tmvar COMMA tmvar RP",
- /* 159 */ "interval_opt ::=",
- /* 160 */ "fill_opt ::=",
- /* 161 */ "fill_opt ::= FILL LP ID COMMA tagitemlist RP",
- /* 162 */ "fill_opt ::= FILL LP ID RP",
- /* 163 */ "sliding_opt ::= SLIDING LP tmvar RP",
- /* 164 */ "sliding_opt ::=",
- /* 165 */ "orderby_opt ::=",
- /* 166 */ "orderby_opt ::= ORDER BY sortlist",
- /* 167 */ "sortlist ::= sortlist COMMA item sortorder",
- /* 168 */ "sortlist ::= item sortorder",
- /* 169 */ "item ::= ids cpxName",
- /* 170 */ "sortorder ::= ASC",
- /* 171 */ "sortorder ::= DESC",
- /* 172 */ "sortorder ::=",
- /* 173 */ "groupby_opt ::=",
- /* 174 */ "groupby_opt ::= GROUP BY grouplist",
- /* 175 */ "grouplist ::= grouplist COMMA item",
- /* 176 */ "grouplist ::= item",
- /* 177 */ "having_opt ::=",
- /* 178 */ "having_opt ::= HAVING expr",
- /* 179 */ "limit_opt ::=",
- /* 180 */ "limit_opt ::= LIMIT signed",
- /* 181 */ "limit_opt ::= LIMIT signed OFFSET signed",
- /* 182 */ "limit_opt ::= LIMIT signed COMMA signed",
- /* 183 */ "slimit_opt ::=",
- /* 184 */ "slimit_opt ::= SLIMIT signed",
- /* 185 */ "slimit_opt ::= SLIMIT signed SOFFSET signed",
- /* 186 */ "slimit_opt ::= SLIMIT signed COMMA signed",
- /* 187 */ "where_opt ::=",
- /* 188 */ "where_opt ::= WHERE expr",
- /* 189 */ "expr ::= LP expr RP",
- /* 190 */ "expr ::= ID",
- /* 191 */ "expr ::= ID DOT ID",
- /* 192 */ "expr ::= ID DOT STAR",
- /* 193 */ "expr ::= INTEGER",
- /* 194 */ "expr ::= MINUS INTEGER",
- /* 195 */ "expr ::= PLUS INTEGER",
- /* 196 */ "expr ::= FLOAT",
- /* 197 */ "expr ::= MINUS FLOAT",
- /* 198 */ "expr ::= PLUS FLOAT",
- /* 199 */ "expr ::= STRING",
- /* 200 */ "expr ::= NOW",
- /* 201 */ "expr ::= VARIABLE",
- /* 202 */ "expr ::= BOOL",
- /* 203 */ "expr ::= ID LP exprlist RP",
- /* 204 */ "expr ::= ID LP STAR RP",
- /* 205 */ "expr ::= expr IS NULL",
- /* 206 */ "expr ::= expr IS NOT NULL",
- /* 207 */ "expr ::= expr LT expr",
- /* 208 */ "expr ::= expr GT expr",
- /* 209 */ "expr ::= expr LE expr",
- /* 210 */ "expr ::= expr GE expr",
- /* 211 */ "expr ::= expr NE expr",
- /* 212 */ "expr ::= expr EQ expr",
- /* 213 */ "expr ::= expr AND expr",
- /* 214 */ "expr ::= expr OR expr",
- /* 215 */ "expr ::= expr PLUS expr",
- /* 216 */ "expr ::= expr MINUS expr",
- /* 217 */ "expr ::= expr STAR expr",
- /* 218 */ "expr ::= expr SLASH expr",
- /* 219 */ "expr ::= expr REM expr",
- /* 220 */ "expr ::= expr LIKE expr",
- /* 221 */ "expr ::= expr IN LP exprlist RP",
- /* 222 */ "exprlist ::= exprlist COMMA expritem",
- /* 223 */ "exprlist ::= expritem",
- /* 224 */ "expritem ::= expr",
- /* 225 */ "expritem ::=",
- /* 226 */ "cmd ::= RESET QUERY CACHE",
- /* 227 */ "cmd ::= ALTER TABLE ids cpxName ADD COLUMN columnlist",
- /* 228 */ "cmd ::= ALTER TABLE ids cpxName DROP COLUMN ids",
- /* 229 */ "cmd ::= ALTER TABLE ids cpxName ADD TAG columnlist",
- /* 230 */ "cmd ::= ALTER TABLE ids cpxName DROP TAG ids",
- /* 231 */ "cmd ::= ALTER TABLE ids cpxName CHANGE TAG ids ids",
- /* 232 */ "cmd ::= ALTER TABLE ids cpxName SET TAG ids EQ tagitem",
- /* 233 */ "cmd ::= KILL CONNECTION INTEGER",
- /* 234 */ "cmd ::= KILL STREAM INTEGER COLON INTEGER",
- /* 235 */ "cmd ::= KILL QUERY INTEGER COLON INTEGER",
+ /* 86 */ "cachelast ::= CACHELAST INTEGER",
+ /* 87 */ "db_optr ::=",
+ /* 88 */ "db_optr ::= db_optr cache",
+ /* 89 */ "db_optr ::= db_optr replica",
+ /* 90 */ "db_optr ::= db_optr quorum",
+ /* 91 */ "db_optr ::= db_optr days",
+ /* 92 */ "db_optr ::= db_optr minrows",
+ /* 93 */ "db_optr ::= db_optr maxrows",
+ /* 94 */ "db_optr ::= db_optr blocks",
+ /* 95 */ "db_optr ::= db_optr ctime",
+ /* 96 */ "db_optr ::= db_optr wal",
+ /* 97 */ "db_optr ::= db_optr fsync",
+ /* 98 */ "db_optr ::= db_optr comp",
+ /* 99 */ "db_optr ::= db_optr prec",
+ /* 100 */ "db_optr ::= db_optr keep",
+ /* 101 */ "db_optr ::= db_optr update",
+ /* 102 */ "db_optr ::= db_optr cachelast",
+ /* 103 */ "alter_db_optr ::=",
+ /* 104 */ "alter_db_optr ::= alter_db_optr replica",
+ /* 105 */ "alter_db_optr ::= alter_db_optr quorum",
+ /* 106 */ "alter_db_optr ::= alter_db_optr keep",
+ /* 107 */ "alter_db_optr ::= alter_db_optr blocks",
+ /* 108 */ "alter_db_optr ::= alter_db_optr comp",
+ /* 109 */ "alter_db_optr ::= alter_db_optr wal",
+ /* 110 */ "alter_db_optr ::= alter_db_optr fsync",
+ /* 111 */ "alter_db_optr ::= alter_db_optr update",
+ /* 112 */ "alter_db_optr ::= alter_db_optr cachelast",
+ /* 113 */ "typename ::= ids",
+ /* 114 */ "typename ::= ids LP signed RP",
+ /* 115 */ "signed ::= INTEGER",
+ /* 116 */ "signed ::= PLUS INTEGER",
+ /* 117 */ "signed ::= MINUS INTEGER",
+ /* 118 */ "cmd ::= CREATE TABLE create_table_args",
+ /* 119 */ "cmd ::= CREATE TABLE create_table_list",
+ /* 120 */ "create_table_list ::= create_from_stable",
+ /* 121 */ "create_table_list ::= create_table_list create_from_stable",
+ /* 122 */ "create_table_args ::= ifnotexists ids cpxName LP columnlist RP",
+ /* 123 */ "create_table_args ::= ifnotexists ids cpxName LP columnlist RP TAGS LP columnlist RP",
+ /* 124 */ "create_from_stable ::= ifnotexists ids cpxName USING ids cpxName TAGS LP tagitemlist RP",
+ /* 125 */ "create_table_args ::= ifnotexists ids cpxName AS select",
+ /* 126 */ "columnlist ::= columnlist COMMA column",
+ /* 127 */ "columnlist ::= column",
+ /* 128 */ "column ::= ids typename",
+ /* 129 */ "tagitemlist ::= tagitemlist COMMA tagitem",
+ /* 130 */ "tagitemlist ::= tagitem",
+ /* 131 */ "tagitem ::= INTEGER",
+ /* 132 */ "tagitem ::= FLOAT",
+ /* 133 */ "tagitem ::= STRING",
+ /* 134 */ "tagitem ::= BOOL",
+ /* 135 */ "tagitem ::= NULL",
+ /* 136 */ "tagitem ::= MINUS INTEGER",
+ /* 137 */ "tagitem ::= MINUS FLOAT",
+ /* 138 */ "tagitem ::= PLUS INTEGER",
+ /* 139 */ "tagitem ::= PLUS FLOAT",
+ /* 140 */ "select ::= SELECT selcollist from where_opt interval_opt fill_opt sliding_opt groupby_opt orderby_opt having_opt slimit_opt limit_opt",
+ /* 141 */ "union ::= select",
+ /* 142 */ "union ::= LP union RP",
+ /* 143 */ "union ::= union UNION ALL select",
+ /* 144 */ "union ::= union UNION ALL LP select RP",
+ /* 145 */ "cmd ::= union",
+ /* 146 */ "select ::= SELECT selcollist",
+ /* 147 */ "sclp ::= selcollist COMMA",
+ /* 148 */ "sclp ::=",
+ /* 149 */ "selcollist ::= sclp expr as",
+ /* 150 */ "selcollist ::= sclp STAR",
+ /* 151 */ "as ::= AS ids",
+ /* 152 */ "as ::= ids",
+ /* 153 */ "as ::=",
+ /* 154 */ "from ::= FROM tablelist",
+ /* 155 */ "tablelist ::= ids cpxName",
+ /* 156 */ "tablelist ::= ids cpxName ids",
+ /* 157 */ "tablelist ::= tablelist COMMA ids cpxName",
+ /* 158 */ "tablelist ::= tablelist COMMA ids cpxName ids",
+ /* 159 */ "tmvar ::= VARIABLE",
+ /* 160 */ "interval_opt ::= INTERVAL LP tmvar RP",
+ /* 161 */ "interval_opt ::= INTERVAL LP tmvar COMMA tmvar RP",
+ /* 162 */ "interval_opt ::=",
+ /* 163 */ "fill_opt ::=",
+ /* 164 */ "fill_opt ::= FILL LP ID COMMA tagitemlist RP",
+ /* 165 */ "fill_opt ::= FILL LP ID RP",
+ /* 166 */ "sliding_opt ::= SLIDING LP tmvar RP",
+ /* 167 */ "sliding_opt ::=",
+ /* 168 */ "orderby_opt ::=",
+ /* 169 */ "orderby_opt ::= ORDER BY sortlist",
+ /* 170 */ "sortlist ::= sortlist COMMA item sortorder",
+ /* 171 */ "sortlist ::= item sortorder",
+ /* 172 */ "item ::= ids cpxName",
+ /* 173 */ "sortorder ::= ASC",
+ /* 174 */ "sortorder ::= DESC",
+ /* 175 */ "sortorder ::=",
+ /* 176 */ "groupby_opt ::=",
+ /* 177 */ "groupby_opt ::= GROUP BY grouplist",
+ /* 178 */ "grouplist ::= grouplist COMMA item",
+ /* 179 */ "grouplist ::= item",
+ /* 180 */ "having_opt ::=",
+ /* 181 */ "having_opt ::= HAVING expr",
+ /* 182 */ "limit_opt ::=",
+ /* 183 */ "limit_opt ::= LIMIT signed",
+ /* 184 */ "limit_opt ::= LIMIT signed OFFSET signed",
+ /* 185 */ "limit_opt ::= LIMIT signed COMMA signed",
+ /* 186 */ "slimit_opt ::=",
+ /* 187 */ "slimit_opt ::= SLIMIT signed",
+ /* 188 */ "slimit_opt ::= SLIMIT signed SOFFSET signed",
+ /* 189 */ "slimit_opt ::= SLIMIT signed COMMA signed",
+ /* 190 */ "where_opt ::=",
+ /* 191 */ "where_opt ::= WHERE expr",
+ /* 192 */ "expr ::= LP expr RP",
+ /* 193 */ "expr ::= ID",
+ /* 194 */ "expr ::= ID DOT ID",
+ /* 195 */ "expr ::= ID DOT STAR",
+ /* 196 */ "expr ::= INTEGER",
+ /* 197 */ "expr ::= MINUS INTEGER",
+ /* 198 */ "expr ::= PLUS INTEGER",
+ /* 199 */ "expr ::= FLOAT",
+ /* 200 */ "expr ::= MINUS FLOAT",
+ /* 201 */ "expr ::= PLUS FLOAT",
+ /* 202 */ "expr ::= STRING",
+ /* 203 */ "expr ::= NOW",
+ /* 204 */ "expr ::= VARIABLE",
+ /* 205 */ "expr ::= BOOL",
+ /* 206 */ "expr ::= ID LP exprlist RP",
+ /* 207 */ "expr ::= ID LP STAR RP",
+ /* 208 */ "expr ::= expr IS NULL",
+ /* 209 */ "expr ::= expr IS NOT NULL",
+ /* 210 */ "expr ::= expr LT expr",
+ /* 211 */ "expr ::= expr GT expr",
+ /* 212 */ "expr ::= expr LE expr",
+ /* 213 */ "expr ::= expr GE expr",
+ /* 214 */ "expr ::= expr NE expr",
+ /* 215 */ "expr ::= expr EQ expr",
+ /* 216 */ "expr ::= expr AND expr",
+ /* 217 */ "expr ::= expr OR expr",
+ /* 218 */ "expr ::= expr PLUS expr",
+ /* 219 */ "expr ::= expr MINUS expr",
+ /* 220 */ "expr ::= expr STAR expr",
+ /* 221 */ "expr ::= expr SLASH expr",
+ /* 222 */ "expr ::= expr REM expr",
+ /* 223 */ "expr ::= expr LIKE expr",
+ /* 224 */ "expr ::= expr IN LP exprlist RP",
+ /* 225 */ "exprlist ::= exprlist COMMA expritem",
+ /* 226 */ "exprlist ::= expritem",
+ /* 227 */ "expritem ::= expr",
+ /* 228 */ "expritem ::=",
+ /* 229 */ "cmd ::= RESET QUERY CACHE",
+ /* 230 */ "cmd ::= ALTER TABLE ids cpxName ADD COLUMN columnlist",
+ /* 231 */ "cmd ::= ALTER TABLE ids cpxName DROP COLUMN ids",
+ /* 232 */ "cmd ::= ALTER TABLE ids cpxName ADD TAG columnlist",
+ /* 233 */ "cmd ::= ALTER TABLE ids cpxName DROP TAG ids",
+ /* 234 */ "cmd ::= ALTER TABLE ids cpxName CHANGE TAG ids ids",
+ /* 235 */ "cmd ::= ALTER TABLE ids cpxName SET TAG ids EQ tagitem",
+ /* 236 */ "cmd ::= KILL CONNECTION INTEGER",
+ /* 237 */ "cmd ::= KILL STREAM INTEGER COLON INTEGER",
+ /* 238 */ "cmd ::= KILL QUERY INTEGER COLON INTEGER",
};
#endif /* NDEBUG */
@@ -1373,51 +1381,51 @@ static void yy_destructor(
** inside the C code.
*/
/********* Begin destructor definitions ***************************************/
- case 227: /* keep */
- case 228: /* tagitemlist */
- case 247: /* columnlist */
- case 255: /* fill_opt */
- case 257: /* groupby_opt */
- case 258: /* orderby_opt */
- case 268: /* sortlist */
- case 272: /* grouplist */
+ case 228: /* keep */
+ case 229: /* tagitemlist */
+ case 249: /* columnlist */
+ case 257: /* fill_opt */
+ case 259: /* groupby_opt */
+ case 260: /* orderby_opt */
+ case 270: /* sortlist */
+ case 274: /* grouplist */
{
-taosArrayDestroy((yypminor->yy131));
+taosArrayDestroy((yypminor->yy403));
}
break;
- case 245: /* create_table_list */
+ case 247: /* create_table_list */
{
-destroyCreateTableSql((yypminor->yy538));
+destroyCreateTableSql((yypminor->yy436));
}
break;
- case 248: /* select */
+ case 250: /* select */
{
-doDestroyQuerySql((yypminor->yy84));
+doDestroyQuerySql((yypminor->yy4));
}
break;
- case 251: /* selcollist */
- case 263: /* sclp */
- case 273: /* exprlist */
+ case 253: /* selcollist */
+ case 265: /* sclp */
+ case 275: /* exprlist */
{
- tSqlExprListDestroy((yypminor->yy478));
+tSqlExprListDestroy((yypminor->yy382));
}
break;
- case 253: /* where_opt */
- case 259: /* having_opt */
- case 264: /* expr */
- case 274: /* expritem */
+ case 255: /* where_opt */
+ case 261: /* having_opt */
+ case 266: /* expr */
+ case 276: /* expritem */
{
- tSqlExprDestroy((yypminor->yy420));
+tSqlExprDestroy((yypminor->yy522));
}
break;
- case 262: /* union */
+ case 264: /* union */
{
-destroyAllSelectClause((yypminor->yy513));
+destroyAllSelectClause((yypminor->yy13));
}
break;
- case 269: /* sortitem */
+ case 271: /* sortitem */
{
-tVariantDestroy(&(yypminor->yy516));
+tVariantDestroy(&(yypminor->yy488));
}
break;
/********* End destructor definitions *****************************************/
@@ -1711,242 +1719,245 @@ static const struct {
YYCODETYPE lhs; /* Symbol on the left-hand side of the rule */
signed char nrhs; /* Negative of the number of RHS symbols in the rule */
} yyRuleInfo[] = {
- { 208, -1 }, /* (0) program ::= cmd */
- { 209, -2 }, /* (1) cmd ::= SHOW DATABASES */
- { 209, -2 }, /* (2) cmd ::= SHOW MNODES */
- { 209, -2 }, /* (3) cmd ::= SHOW DNODES */
- { 209, -2 }, /* (4) cmd ::= SHOW ACCOUNTS */
- { 209, -2 }, /* (5) cmd ::= SHOW USERS */
- { 209, -2 }, /* (6) cmd ::= SHOW MODULES */
- { 209, -2 }, /* (7) cmd ::= SHOW QUERIES */
- { 209, -2 }, /* (8) cmd ::= SHOW CONNECTIONS */
- { 209, -2 }, /* (9) cmd ::= SHOW STREAMS */
- { 209, -2 }, /* (10) cmd ::= SHOW VARIABLES */
- { 209, -2 }, /* (11) cmd ::= SHOW SCORES */
- { 209, -2 }, /* (12) cmd ::= SHOW GRANTS */
- { 209, -2 }, /* (13) cmd ::= SHOW VNODES */
- { 209, -3 }, /* (14) cmd ::= SHOW VNODES IPTOKEN */
- { 210, 0 }, /* (15) dbPrefix ::= */
- { 210, -2 }, /* (16) dbPrefix ::= ids DOT */
- { 212, 0 }, /* (17) cpxName ::= */
- { 212, -2 }, /* (18) cpxName ::= DOT ids */
- { 209, -5 }, /* (19) cmd ::= SHOW CREATE TABLE ids cpxName */
- { 209, -4 }, /* (20) cmd ::= SHOW CREATE DATABASE ids */
- { 209, -3 }, /* (21) cmd ::= SHOW dbPrefix TABLES */
- { 209, -5 }, /* (22) cmd ::= SHOW dbPrefix TABLES LIKE ids */
- { 209, -3 }, /* (23) cmd ::= SHOW dbPrefix STABLES */
- { 209, -5 }, /* (24) cmd ::= SHOW dbPrefix STABLES LIKE ids */
- { 209, -3 }, /* (25) cmd ::= SHOW dbPrefix VGROUPS */
- { 209, -4 }, /* (26) cmd ::= SHOW dbPrefix VGROUPS ids */
- { 209, -5 }, /* (27) cmd ::= DROP TABLE ifexists ids cpxName */
- { 209, -4 }, /* (28) cmd ::= DROP DATABASE ifexists ids */
- { 209, -3 }, /* (29) cmd ::= DROP DNODE ids */
- { 209, -3 }, /* (30) cmd ::= DROP USER ids */
- { 209, -3 }, /* (31) cmd ::= DROP ACCOUNT ids */
- { 209, -2 }, /* (32) cmd ::= USE ids */
- { 209, -3 }, /* (33) cmd ::= DESCRIBE ids cpxName */
- { 209, -5 }, /* (34) cmd ::= ALTER USER ids PASS ids */
- { 209, -5 }, /* (35) cmd ::= ALTER USER ids PRIVILEGE ids */
- { 209, -4 }, /* (36) cmd ::= ALTER DNODE ids ids */
- { 209, -5 }, /* (37) cmd ::= ALTER DNODE ids ids ids */
- { 209, -3 }, /* (38) cmd ::= ALTER LOCAL ids */
- { 209, -4 }, /* (39) cmd ::= ALTER LOCAL ids ids */
- { 209, -4 }, /* (40) cmd ::= ALTER DATABASE ids alter_db_optr */
- { 209, -4 }, /* (41) cmd ::= ALTER ACCOUNT ids acct_optr */
- { 209, -6 }, /* (42) cmd ::= ALTER ACCOUNT ids PASS ids acct_optr */
- { 211, -1 }, /* (43) ids ::= ID */
- { 211, -1 }, /* (44) ids ::= STRING */
- { 213, -2 }, /* (45) ifexists ::= IF EXISTS */
- { 213, 0 }, /* (46) ifexists ::= */
- { 216, -3 }, /* (47) ifnotexists ::= IF NOT EXISTS */
- { 216, 0 }, /* (48) ifnotexists ::= */
- { 209, -3 }, /* (49) cmd ::= CREATE DNODE ids */
- { 209, -6 }, /* (50) cmd ::= CREATE ACCOUNT ids PASS ids acct_optr */
- { 209, -5 }, /* (51) cmd ::= CREATE DATABASE ifnotexists ids db_optr */
- { 209, -5 }, /* (52) cmd ::= CREATE USER ids PASS ids */
- { 218, 0 }, /* (53) pps ::= */
- { 218, -2 }, /* (54) pps ::= PPS INTEGER */
- { 219, 0 }, /* (55) tseries ::= */
- { 219, -2 }, /* (56) tseries ::= TSERIES INTEGER */
- { 220, 0 }, /* (57) dbs ::= */
- { 220, -2 }, /* (58) dbs ::= DBS INTEGER */
- { 221, 0 }, /* (59) streams ::= */
- { 221, -2 }, /* (60) streams ::= STREAMS INTEGER */
- { 222, 0 }, /* (61) storage ::= */
- { 222, -2 }, /* (62) storage ::= STORAGE INTEGER */
- { 223, 0 }, /* (63) qtime ::= */
- { 223, -2 }, /* (64) qtime ::= QTIME INTEGER */
- { 224, 0 }, /* (65) users ::= */
- { 224, -2 }, /* (66) users ::= USERS INTEGER */
- { 225, 0 }, /* (67) conns ::= */
- { 225, -2 }, /* (68) conns ::= CONNS INTEGER */
- { 226, 0 }, /* (69) state ::= */
- { 226, -2 }, /* (70) state ::= STATE ids */
- { 215, -9 }, /* (71) acct_optr ::= pps tseries storage streams qtime dbs users conns state */
- { 227, -2 }, /* (72) keep ::= KEEP tagitemlist */
- { 229, -2 }, /* (73) cache ::= CACHE INTEGER */
- { 230, -2 }, /* (74) replica ::= REPLICA INTEGER */
- { 231, -2 }, /* (75) quorum ::= QUORUM INTEGER */
- { 232, -2 }, /* (76) days ::= DAYS INTEGER */
- { 233, -2 }, /* (77) minrows ::= MINROWS INTEGER */
- { 234, -2 }, /* (78) maxrows ::= MAXROWS INTEGER */
- { 235, -2 }, /* (79) blocks ::= BLOCKS INTEGER */
- { 236, -2 }, /* (80) ctime ::= CTIME INTEGER */
- { 237, -2 }, /* (81) wal ::= WAL INTEGER */
- { 238, -2 }, /* (82) fsync ::= FSYNC INTEGER */
- { 239, -2 }, /* (83) comp ::= COMP INTEGER */
- { 240, -2 }, /* (84) prec ::= PRECISION STRING */
- { 241, -2 }, /* (85) update ::= UPDATE INTEGER */
- { 217, 0 }, /* (86) db_optr ::= */
- { 217, -2 }, /* (87) db_optr ::= db_optr cache */
- { 217, -2 }, /* (88) db_optr ::= db_optr replica */
- { 217, -2 }, /* (89) db_optr ::= db_optr quorum */
- { 217, -2 }, /* (90) db_optr ::= db_optr days */
- { 217, -2 }, /* (91) db_optr ::= db_optr minrows */
- { 217, -2 }, /* (92) db_optr ::= db_optr maxrows */
- { 217, -2 }, /* (93) db_optr ::= db_optr blocks */
- { 217, -2 }, /* (94) db_optr ::= db_optr ctime */
- { 217, -2 }, /* (95) db_optr ::= db_optr wal */
- { 217, -2 }, /* (96) db_optr ::= db_optr fsync */
- { 217, -2 }, /* (97) db_optr ::= db_optr comp */
- { 217, -2 }, /* (98) db_optr ::= db_optr prec */
- { 217, -2 }, /* (99) db_optr ::= db_optr keep */
- { 217, -2 }, /* (100) db_optr ::= db_optr update */
- { 214, 0 }, /* (101) alter_db_optr ::= */
- { 214, -2 }, /* (102) alter_db_optr ::= alter_db_optr replica */
- { 214, -2 }, /* (103) alter_db_optr ::= alter_db_optr quorum */
- { 214, -2 }, /* (104) alter_db_optr ::= alter_db_optr keep */
- { 214, -2 }, /* (105) alter_db_optr ::= alter_db_optr blocks */
- { 214, -2 }, /* (106) alter_db_optr ::= alter_db_optr comp */
- { 214, -2 }, /* (107) alter_db_optr ::= alter_db_optr wal */
- { 214, -2 }, /* (108) alter_db_optr ::= alter_db_optr fsync */
- { 214, -2 }, /* (109) alter_db_optr ::= alter_db_optr update */
- { 242, -1 }, /* (110) typename ::= ids */
- { 242, -4 }, /* (111) typename ::= ids LP signed RP */
- { 243, -1 }, /* (112) signed ::= INTEGER */
- { 243, -2 }, /* (113) signed ::= PLUS INTEGER */
- { 243, -2 }, /* (114) signed ::= MINUS INTEGER */
- { 209, -3 }, /* (115) cmd ::= CREATE TABLE create_table_args */
- { 209, -3 }, /* (116) cmd ::= CREATE TABLE create_table_list */
- { 245, -1 }, /* (117) create_table_list ::= create_from_stable */
- { 245, -2 }, /* (118) create_table_list ::= create_table_list create_from_stable */
- { 244, -6 }, /* (119) create_table_args ::= ifnotexists ids cpxName LP columnlist RP */
- { 244, -10 }, /* (120) create_table_args ::= ifnotexists ids cpxName LP columnlist RP TAGS LP columnlist RP */
- { 246, -10 }, /* (121) create_from_stable ::= ifnotexists ids cpxName USING ids cpxName TAGS LP tagitemlist RP */
- { 244, -5 }, /* (122) create_table_args ::= ifnotexists ids cpxName AS select */
- { 247, -3 }, /* (123) columnlist ::= columnlist COMMA column */
- { 247, -1 }, /* (124) columnlist ::= column */
- { 249, -2 }, /* (125) column ::= ids typename */
- { 228, -3 }, /* (126) tagitemlist ::= tagitemlist COMMA tagitem */
- { 228, -1 }, /* (127) tagitemlist ::= tagitem */
- { 250, -1 }, /* (128) tagitem ::= INTEGER */
- { 250, -1 }, /* (129) tagitem ::= FLOAT */
- { 250, -1 }, /* (130) tagitem ::= STRING */
- { 250, -1 }, /* (131) tagitem ::= BOOL */
- { 250, -1 }, /* (132) tagitem ::= NULL */
- { 250, -2 }, /* (133) tagitem ::= MINUS INTEGER */
- { 250, -2 }, /* (134) tagitem ::= MINUS FLOAT */
- { 250, -2 }, /* (135) tagitem ::= PLUS INTEGER */
- { 250, -2 }, /* (136) tagitem ::= PLUS FLOAT */
- { 248, -12 }, /* (137) select ::= SELECT selcollist from where_opt interval_opt fill_opt sliding_opt groupby_opt orderby_opt having_opt slimit_opt limit_opt */
- { 262, -1 }, /* (138) union ::= select */
- { 262, -3 }, /* (139) union ::= LP union RP */
- { 262, -4 }, /* (140) union ::= union UNION ALL select */
- { 262, -6 }, /* (141) union ::= union UNION ALL LP select RP */
- { 209, -1 }, /* (142) cmd ::= union */
- { 248, -2 }, /* (143) select ::= SELECT selcollist */
- { 263, -2 }, /* (144) sclp ::= selcollist COMMA */
- { 263, 0 }, /* (145) sclp ::= */
- { 251, -3 }, /* (146) selcollist ::= sclp expr as */
- { 251, -2 }, /* (147) selcollist ::= sclp STAR */
- { 265, -2 }, /* (148) as ::= AS ids */
- { 265, -1 }, /* (149) as ::= ids */
- { 265, 0 }, /* (150) as ::= */
- { 252, -2 }, /* (151) from ::= FROM tablelist */
- { 266, -2 }, /* (152) tablelist ::= ids cpxName */
- { 266, -3 }, /* (153) tablelist ::= ids cpxName ids */
- { 266, -4 }, /* (154) tablelist ::= tablelist COMMA ids cpxName */
- { 266, -5 }, /* (155) tablelist ::= tablelist COMMA ids cpxName ids */
- { 267, -1 }, /* (156) tmvar ::= VARIABLE */
- { 254, -4 }, /* (157) interval_opt ::= INTERVAL LP tmvar RP */
- { 254, -6 }, /* (158) interval_opt ::= INTERVAL LP tmvar COMMA tmvar RP */
- { 254, 0 }, /* (159) interval_opt ::= */
- { 255, 0 }, /* (160) fill_opt ::= */
- { 255, -6 }, /* (161) fill_opt ::= FILL LP ID COMMA tagitemlist RP */
- { 255, -4 }, /* (162) fill_opt ::= FILL LP ID RP */
- { 256, -4 }, /* (163) sliding_opt ::= SLIDING LP tmvar RP */
- { 256, 0 }, /* (164) sliding_opt ::= */
- { 258, 0 }, /* (165) orderby_opt ::= */
- { 258, -3 }, /* (166) orderby_opt ::= ORDER BY sortlist */
- { 268, -4 }, /* (167) sortlist ::= sortlist COMMA item sortorder */
- { 268, -2 }, /* (168) sortlist ::= item sortorder */
- { 270, -2 }, /* (169) item ::= ids cpxName */
- { 271, -1 }, /* (170) sortorder ::= ASC */
- { 271, -1 }, /* (171) sortorder ::= DESC */
- { 271, 0 }, /* (172) sortorder ::= */
- { 257, 0 }, /* (173) groupby_opt ::= */
- { 257, -3 }, /* (174) groupby_opt ::= GROUP BY grouplist */
- { 272, -3 }, /* (175) grouplist ::= grouplist COMMA item */
- { 272, -1 }, /* (176) grouplist ::= item */
- { 259, 0 }, /* (177) having_opt ::= */
- { 259, -2 }, /* (178) having_opt ::= HAVING expr */
- { 261, 0 }, /* (179) limit_opt ::= */
- { 261, -2 }, /* (180) limit_opt ::= LIMIT signed */
- { 261, -4 }, /* (181) limit_opt ::= LIMIT signed OFFSET signed */
- { 261, -4 }, /* (182) limit_opt ::= LIMIT signed COMMA signed */
- { 260, 0 }, /* (183) slimit_opt ::= */
- { 260, -2 }, /* (184) slimit_opt ::= SLIMIT signed */
- { 260, -4 }, /* (185) slimit_opt ::= SLIMIT signed SOFFSET signed */
- { 260, -4 }, /* (186) slimit_opt ::= SLIMIT signed COMMA signed */
- { 253, 0 }, /* (187) where_opt ::= */
- { 253, -2 }, /* (188) where_opt ::= WHERE expr */
- { 264, -3 }, /* (189) expr ::= LP expr RP */
- { 264, -1 }, /* (190) expr ::= ID */
- { 264, -3 }, /* (191) expr ::= ID DOT ID */
- { 264, -3 }, /* (192) expr ::= ID DOT STAR */
- { 264, -1 }, /* (193) expr ::= INTEGER */
- { 264, -2 }, /* (194) expr ::= MINUS INTEGER */
- { 264, -2 }, /* (195) expr ::= PLUS INTEGER */
- { 264, -1 }, /* (196) expr ::= FLOAT */
- { 264, -2 }, /* (197) expr ::= MINUS FLOAT */
- { 264, -2 }, /* (198) expr ::= PLUS FLOAT */
- { 264, -1 }, /* (199) expr ::= STRING */
- { 264, -1 }, /* (200) expr ::= NOW */
- { 264, -1 }, /* (201) expr ::= VARIABLE */
- { 264, -1 }, /* (202) expr ::= BOOL */
- { 264, -4 }, /* (203) expr ::= ID LP exprlist RP */
- { 264, -4 }, /* (204) expr ::= ID LP STAR RP */
- { 264, -3 }, /* (205) expr ::= expr IS NULL */
- { 264, -4 }, /* (206) expr ::= expr IS NOT NULL */
- { 264, -3 }, /* (207) expr ::= expr LT expr */
- { 264, -3 }, /* (208) expr ::= expr GT expr */
- { 264, -3 }, /* (209) expr ::= expr LE expr */
- { 264, -3 }, /* (210) expr ::= expr GE expr */
- { 264, -3 }, /* (211) expr ::= expr NE expr */
- { 264, -3 }, /* (212) expr ::= expr EQ expr */
- { 264, -3 }, /* (213) expr ::= expr AND expr */
- { 264, -3 }, /* (214) expr ::= expr OR expr */
- { 264, -3 }, /* (215) expr ::= expr PLUS expr */
- { 264, -3 }, /* (216) expr ::= expr MINUS expr */
- { 264, -3 }, /* (217) expr ::= expr STAR expr */
- { 264, -3 }, /* (218) expr ::= expr SLASH expr */
- { 264, -3 }, /* (219) expr ::= expr REM expr */
- { 264, -3 }, /* (220) expr ::= expr LIKE expr */
- { 264, -5 }, /* (221) expr ::= expr IN LP exprlist RP */
- { 273, -3 }, /* (222) exprlist ::= exprlist COMMA expritem */
- { 273, -1 }, /* (223) exprlist ::= expritem */
- { 274, -1 }, /* (224) expritem ::= expr */
- { 274, 0 }, /* (225) expritem ::= */
- { 209, -3 }, /* (226) cmd ::= RESET QUERY CACHE */
- { 209, -7 }, /* (227) cmd ::= ALTER TABLE ids cpxName ADD COLUMN columnlist */
- { 209, -7 }, /* (228) cmd ::= ALTER TABLE ids cpxName DROP COLUMN ids */
- { 209, -7 }, /* (229) cmd ::= ALTER TABLE ids cpxName ADD TAG columnlist */
- { 209, -7 }, /* (230) cmd ::= ALTER TABLE ids cpxName DROP TAG ids */
- { 209, -8 }, /* (231) cmd ::= ALTER TABLE ids cpxName CHANGE TAG ids ids */
- { 209, -9 }, /* (232) cmd ::= ALTER TABLE ids cpxName SET TAG ids EQ tagitem */
- { 209, -3 }, /* (233) cmd ::= KILL CONNECTION INTEGER */
- { 209, -5 }, /* (234) cmd ::= KILL STREAM INTEGER COLON INTEGER */
- { 209, -5 }, /* (235) cmd ::= KILL QUERY INTEGER COLON INTEGER */
+ { 209, -1 }, /* (0) program ::= cmd */
+ { 210, -2 }, /* (1) cmd ::= SHOW DATABASES */
+ { 210, -2 }, /* (2) cmd ::= SHOW MNODES */
+ { 210, -2 }, /* (3) cmd ::= SHOW DNODES */
+ { 210, -2 }, /* (4) cmd ::= SHOW ACCOUNTS */
+ { 210, -2 }, /* (5) cmd ::= SHOW USERS */
+ { 210, -2 }, /* (6) cmd ::= SHOW MODULES */
+ { 210, -2 }, /* (7) cmd ::= SHOW QUERIES */
+ { 210, -2 }, /* (8) cmd ::= SHOW CONNECTIONS */
+ { 210, -2 }, /* (9) cmd ::= SHOW STREAMS */
+ { 210, -2 }, /* (10) cmd ::= SHOW VARIABLES */
+ { 210, -2 }, /* (11) cmd ::= SHOW SCORES */
+ { 210, -2 }, /* (12) cmd ::= SHOW GRANTS */
+ { 210, -2 }, /* (13) cmd ::= SHOW VNODES */
+ { 210, -3 }, /* (14) cmd ::= SHOW VNODES IPTOKEN */
+ { 211, 0 }, /* (15) dbPrefix ::= */
+ { 211, -2 }, /* (16) dbPrefix ::= ids DOT */
+ { 213, 0 }, /* (17) cpxName ::= */
+ { 213, -2 }, /* (18) cpxName ::= DOT ids */
+ { 210, -5 }, /* (19) cmd ::= SHOW CREATE TABLE ids cpxName */
+ { 210, -4 }, /* (20) cmd ::= SHOW CREATE DATABASE ids */
+ { 210, -3 }, /* (21) cmd ::= SHOW dbPrefix TABLES */
+ { 210, -5 }, /* (22) cmd ::= SHOW dbPrefix TABLES LIKE ids */
+ { 210, -3 }, /* (23) cmd ::= SHOW dbPrefix STABLES */
+ { 210, -5 }, /* (24) cmd ::= SHOW dbPrefix STABLES LIKE ids */
+ { 210, -3 }, /* (25) cmd ::= SHOW dbPrefix VGROUPS */
+ { 210, -4 }, /* (26) cmd ::= SHOW dbPrefix VGROUPS ids */
+ { 210, -5 }, /* (27) cmd ::= DROP TABLE ifexists ids cpxName */
+ { 210, -4 }, /* (28) cmd ::= DROP DATABASE ifexists ids */
+ { 210, -3 }, /* (29) cmd ::= DROP DNODE ids */
+ { 210, -3 }, /* (30) cmd ::= DROP USER ids */
+ { 210, -3 }, /* (31) cmd ::= DROP ACCOUNT ids */
+ { 210, -2 }, /* (32) cmd ::= USE ids */
+ { 210, -3 }, /* (33) cmd ::= DESCRIBE ids cpxName */
+ { 210, -5 }, /* (34) cmd ::= ALTER USER ids PASS ids */
+ { 210, -5 }, /* (35) cmd ::= ALTER USER ids PRIVILEGE ids */
+ { 210, -4 }, /* (36) cmd ::= ALTER DNODE ids ids */
+ { 210, -5 }, /* (37) cmd ::= ALTER DNODE ids ids ids */
+ { 210, -3 }, /* (38) cmd ::= ALTER LOCAL ids */
+ { 210, -4 }, /* (39) cmd ::= ALTER LOCAL ids ids */
+ { 210, -4 }, /* (40) cmd ::= ALTER DATABASE ids alter_db_optr */
+ { 210, -4 }, /* (41) cmd ::= ALTER ACCOUNT ids acct_optr */
+ { 210, -6 }, /* (42) cmd ::= ALTER ACCOUNT ids PASS ids acct_optr */
+ { 212, -1 }, /* (43) ids ::= ID */
+ { 212, -1 }, /* (44) ids ::= STRING */
+ { 214, -2 }, /* (45) ifexists ::= IF EXISTS */
+ { 214, 0 }, /* (46) ifexists ::= */
+ { 217, -3 }, /* (47) ifnotexists ::= IF NOT EXISTS */
+ { 217, 0 }, /* (48) ifnotexists ::= */
+ { 210, -3 }, /* (49) cmd ::= CREATE DNODE ids */
+ { 210, -6 }, /* (50) cmd ::= CREATE ACCOUNT ids PASS ids acct_optr */
+ { 210, -5 }, /* (51) cmd ::= CREATE DATABASE ifnotexists ids db_optr */
+ { 210, -5 }, /* (52) cmd ::= CREATE USER ids PASS ids */
+ { 219, 0 }, /* (53) pps ::= */
+ { 219, -2 }, /* (54) pps ::= PPS INTEGER */
+ { 220, 0 }, /* (55) tseries ::= */
+ { 220, -2 }, /* (56) tseries ::= TSERIES INTEGER */
+ { 221, 0 }, /* (57) dbs ::= */
+ { 221, -2 }, /* (58) dbs ::= DBS INTEGER */
+ { 222, 0 }, /* (59) streams ::= */
+ { 222, -2 }, /* (60) streams ::= STREAMS INTEGER */
+ { 223, 0 }, /* (61) storage ::= */
+ { 223, -2 }, /* (62) storage ::= STORAGE INTEGER */
+ { 224, 0 }, /* (63) qtime ::= */
+ { 224, -2 }, /* (64) qtime ::= QTIME INTEGER */
+ { 225, 0 }, /* (65) users ::= */
+ { 225, -2 }, /* (66) users ::= USERS INTEGER */
+ { 226, 0 }, /* (67) conns ::= */
+ { 226, -2 }, /* (68) conns ::= CONNS INTEGER */
+ { 227, 0 }, /* (69) state ::= */
+ { 227, -2 }, /* (70) state ::= STATE ids */
+ { 216, -9 }, /* (71) acct_optr ::= pps tseries storage streams qtime dbs users conns state */
+ { 228, -2 }, /* (72) keep ::= KEEP tagitemlist */
+ { 230, -2 }, /* (73) cache ::= CACHE INTEGER */
+ { 231, -2 }, /* (74) replica ::= REPLICA INTEGER */
+ { 232, -2 }, /* (75) quorum ::= QUORUM INTEGER */
+ { 233, -2 }, /* (76) days ::= DAYS INTEGER */
+ { 234, -2 }, /* (77) minrows ::= MINROWS INTEGER */
+ { 235, -2 }, /* (78) maxrows ::= MAXROWS INTEGER */
+ { 236, -2 }, /* (79) blocks ::= BLOCKS INTEGER */
+ { 237, -2 }, /* (80) ctime ::= CTIME INTEGER */
+ { 238, -2 }, /* (81) wal ::= WAL INTEGER */
+ { 239, -2 }, /* (82) fsync ::= FSYNC INTEGER */
+ { 240, -2 }, /* (83) comp ::= COMP INTEGER */
+ { 241, -2 }, /* (84) prec ::= PRECISION STRING */
+ { 242, -2 }, /* (85) update ::= UPDATE INTEGER */
+ { 243, -2 }, /* (86) cachelast ::= CACHELAST INTEGER */
+ { 218, 0 }, /* (87) db_optr ::= */
+ { 218, -2 }, /* (88) db_optr ::= db_optr cache */
+ { 218, -2 }, /* (89) db_optr ::= db_optr replica */
+ { 218, -2 }, /* (90) db_optr ::= db_optr quorum */
+ { 218, -2 }, /* (91) db_optr ::= db_optr days */
+ { 218, -2 }, /* (92) db_optr ::= db_optr minrows */
+ { 218, -2 }, /* (93) db_optr ::= db_optr maxrows */
+ { 218, -2 }, /* (94) db_optr ::= db_optr blocks */
+ { 218, -2 }, /* (95) db_optr ::= db_optr ctime */
+ { 218, -2 }, /* (96) db_optr ::= db_optr wal */
+ { 218, -2 }, /* (97) db_optr ::= db_optr fsync */
+ { 218, -2 }, /* (98) db_optr ::= db_optr comp */
+ { 218, -2 }, /* (99) db_optr ::= db_optr prec */
+ { 218, -2 }, /* (100) db_optr ::= db_optr keep */
+ { 218, -2 }, /* (101) db_optr ::= db_optr update */
+ { 218, -2 }, /* (102) db_optr ::= db_optr cachelast */
+ { 215, 0 }, /* (103) alter_db_optr ::= */
+ { 215, -2 }, /* (104) alter_db_optr ::= alter_db_optr replica */
+ { 215, -2 }, /* (105) alter_db_optr ::= alter_db_optr quorum */
+ { 215, -2 }, /* (106) alter_db_optr ::= alter_db_optr keep */
+ { 215, -2 }, /* (107) alter_db_optr ::= alter_db_optr blocks */
+ { 215, -2 }, /* (108) alter_db_optr ::= alter_db_optr comp */
+ { 215, -2 }, /* (109) alter_db_optr ::= alter_db_optr wal */
+ { 215, -2 }, /* (110) alter_db_optr ::= alter_db_optr fsync */
+ { 215, -2 }, /* (111) alter_db_optr ::= alter_db_optr update */
+ { 215, -2 }, /* (112) alter_db_optr ::= alter_db_optr cachelast */
+ { 244, -1 }, /* (113) typename ::= ids */
+ { 244, -4 }, /* (114) typename ::= ids LP signed RP */
+ { 245, -1 }, /* (115) signed ::= INTEGER */
+ { 245, -2 }, /* (116) signed ::= PLUS INTEGER */
+ { 245, -2 }, /* (117) signed ::= MINUS INTEGER */
+ { 210, -3 }, /* (118) cmd ::= CREATE TABLE create_table_args */
+ { 210, -3 }, /* (119) cmd ::= CREATE TABLE create_table_list */
+ { 247, -1 }, /* (120) create_table_list ::= create_from_stable */
+ { 247, -2 }, /* (121) create_table_list ::= create_table_list create_from_stable */
+ { 246, -6 }, /* (122) create_table_args ::= ifnotexists ids cpxName LP columnlist RP */
+ { 246, -10 }, /* (123) create_table_args ::= ifnotexists ids cpxName LP columnlist RP TAGS LP columnlist RP */
+ { 248, -10 }, /* (124) create_from_stable ::= ifnotexists ids cpxName USING ids cpxName TAGS LP tagitemlist RP */
+ { 246, -5 }, /* (125) create_table_args ::= ifnotexists ids cpxName AS select */
+ { 249, -3 }, /* (126) columnlist ::= columnlist COMMA column */
+ { 249, -1 }, /* (127) columnlist ::= column */
+ { 251, -2 }, /* (128) column ::= ids typename */
+ { 229, -3 }, /* (129) tagitemlist ::= tagitemlist COMMA tagitem */
+ { 229, -1 }, /* (130) tagitemlist ::= tagitem */
+ { 252, -1 }, /* (131) tagitem ::= INTEGER */
+ { 252, -1 }, /* (132) tagitem ::= FLOAT */
+ { 252, -1 }, /* (133) tagitem ::= STRING */
+ { 252, -1 }, /* (134) tagitem ::= BOOL */
+ { 252, -1 }, /* (135) tagitem ::= NULL */
+ { 252, -2 }, /* (136) tagitem ::= MINUS INTEGER */
+ { 252, -2 }, /* (137) tagitem ::= MINUS FLOAT */
+ { 252, -2 }, /* (138) tagitem ::= PLUS INTEGER */
+ { 252, -2 }, /* (139) tagitem ::= PLUS FLOAT */
+ { 250, -12 }, /* (140) select ::= SELECT selcollist from where_opt interval_opt fill_opt sliding_opt groupby_opt orderby_opt having_opt slimit_opt limit_opt */
+ { 264, -1 }, /* (141) union ::= select */
+ { 264, -3 }, /* (142) union ::= LP union RP */
+ { 264, -4 }, /* (143) union ::= union UNION ALL select */
+ { 264, -6 }, /* (144) union ::= union UNION ALL LP select RP */
+ { 210, -1 }, /* (145) cmd ::= union */
+ { 250, -2 }, /* (146) select ::= SELECT selcollist */
+ { 265, -2 }, /* (147) sclp ::= selcollist COMMA */
+ { 265, 0 }, /* (148) sclp ::= */
+ { 253, -3 }, /* (149) selcollist ::= sclp expr as */
+ { 253, -2 }, /* (150) selcollist ::= sclp STAR */
+ { 267, -2 }, /* (151) as ::= AS ids */
+ { 267, -1 }, /* (152) as ::= ids */
+ { 267, 0 }, /* (153) as ::= */
+ { 254, -2 }, /* (154) from ::= FROM tablelist */
+ { 268, -2 }, /* (155) tablelist ::= ids cpxName */
+ { 268, -3 }, /* (156) tablelist ::= ids cpxName ids */
+ { 268, -4 }, /* (157) tablelist ::= tablelist COMMA ids cpxName */
+ { 268, -5 }, /* (158) tablelist ::= tablelist COMMA ids cpxName ids */
+ { 269, -1 }, /* (159) tmvar ::= VARIABLE */
+ { 256, -4 }, /* (160) interval_opt ::= INTERVAL LP tmvar RP */
+ { 256, -6 }, /* (161) interval_opt ::= INTERVAL LP tmvar COMMA tmvar RP */
+ { 256, 0 }, /* (162) interval_opt ::= */
+ { 257, 0 }, /* (163) fill_opt ::= */
+ { 257, -6 }, /* (164) fill_opt ::= FILL LP ID COMMA tagitemlist RP */
+ { 257, -4 }, /* (165) fill_opt ::= FILL LP ID RP */
+ { 258, -4 }, /* (166) sliding_opt ::= SLIDING LP tmvar RP */
+ { 258, 0 }, /* (167) sliding_opt ::= */
+ { 260, 0 }, /* (168) orderby_opt ::= */
+ { 260, -3 }, /* (169) orderby_opt ::= ORDER BY sortlist */
+ { 270, -4 }, /* (170) sortlist ::= sortlist COMMA item sortorder */
+ { 270, -2 }, /* (171) sortlist ::= item sortorder */
+ { 272, -2 }, /* (172) item ::= ids cpxName */
+ { 273, -1 }, /* (173) sortorder ::= ASC */
+ { 273, -1 }, /* (174) sortorder ::= DESC */
+ { 273, 0 }, /* (175) sortorder ::= */
+ { 259, 0 }, /* (176) groupby_opt ::= */
+ { 259, -3 }, /* (177) groupby_opt ::= GROUP BY grouplist */
+ { 274, -3 }, /* (178) grouplist ::= grouplist COMMA item */
+ { 274, -1 }, /* (179) grouplist ::= item */
+ { 261, 0 }, /* (180) having_opt ::= */
+ { 261, -2 }, /* (181) having_opt ::= HAVING expr */
+ { 263, 0 }, /* (182) limit_opt ::= */
+ { 263, -2 }, /* (183) limit_opt ::= LIMIT signed */
+ { 263, -4 }, /* (184) limit_opt ::= LIMIT signed OFFSET signed */
+ { 263, -4 }, /* (185) limit_opt ::= LIMIT signed COMMA signed */
+ { 262, 0 }, /* (186) slimit_opt ::= */
+ { 262, -2 }, /* (187) slimit_opt ::= SLIMIT signed */
+ { 262, -4 }, /* (188) slimit_opt ::= SLIMIT signed SOFFSET signed */
+ { 262, -4 }, /* (189) slimit_opt ::= SLIMIT signed COMMA signed */
+ { 255, 0 }, /* (190) where_opt ::= */
+ { 255, -2 }, /* (191) where_opt ::= WHERE expr */
+ { 266, -3 }, /* (192) expr ::= LP expr RP */
+ { 266, -1 }, /* (193) expr ::= ID */
+ { 266, -3 }, /* (194) expr ::= ID DOT ID */
+ { 266, -3 }, /* (195) expr ::= ID DOT STAR */
+ { 266, -1 }, /* (196) expr ::= INTEGER */
+ { 266, -2 }, /* (197) expr ::= MINUS INTEGER */
+ { 266, -2 }, /* (198) expr ::= PLUS INTEGER */
+ { 266, -1 }, /* (199) expr ::= FLOAT */
+ { 266, -2 }, /* (200) expr ::= MINUS FLOAT */
+ { 266, -2 }, /* (201) expr ::= PLUS FLOAT */
+ { 266, -1 }, /* (202) expr ::= STRING */
+ { 266, -1 }, /* (203) expr ::= NOW */
+ { 266, -1 }, /* (204) expr ::= VARIABLE */
+ { 266, -1 }, /* (205) expr ::= BOOL */
+ { 266, -4 }, /* (206) expr ::= ID LP exprlist RP */
+ { 266, -4 }, /* (207) expr ::= ID LP STAR RP */
+ { 266, -3 }, /* (208) expr ::= expr IS NULL */
+ { 266, -4 }, /* (209) expr ::= expr IS NOT NULL */
+ { 266, -3 }, /* (210) expr ::= expr LT expr */
+ { 266, -3 }, /* (211) expr ::= expr GT expr */
+ { 266, -3 }, /* (212) expr ::= expr LE expr */
+ { 266, -3 }, /* (213) expr ::= expr GE expr */
+ { 266, -3 }, /* (214) expr ::= expr NE expr */
+ { 266, -3 }, /* (215) expr ::= expr EQ expr */
+ { 266, -3 }, /* (216) expr ::= expr AND expr */
+ { 266, -3 }, /* (217) expr ::= expr OR expr */
+ { 266, -3 }, /* (218) expr ::= expr PLUS expr */
+ { 266, -3 }, /* (219) expr ::= expr MINUS expr */
+ { 266, -3 }, /* (220) expr ::= expr STAR expr */
+ { 266, -3 }, /* (221) expr ::= expr SLASH expr */
+ { 266, -3 }, /* (222) expr ::= expr REM expr */
+ { 266, -3 }, /* (223) expr ::= expr LIKE expr */
+ { 266, -5 }, /* (224) expr ::= expr IN LP exprlist RP */
+ { 275, -3 }, /* (225) exprlist ::= exprlist COMMA expritem */
+ { 275, -1 }, /* (226) exprlist ::= expritem */
+ { 276, -1 }, /* (227) expritem ::= expr */
+ { 276, 0 }, /* (228) expritem ::= */
+ { 210, -3 }, /* (229) cmd ::= RESET QUERY CACHE */
+ { 210, -7 }, /* (230) cmd ::= ALTER TABLE ids cpxName ADD COLUMN columnlist */
+ { 210, -7 }, /* (231) cmd ::= ALTER TABLE ids cpxName DROP COLUMN ids */
+ { 210, -7 }, /* (232) cmd ::= ALTER TABLE ids cpxName ADD TAG columnlist */
+ { 210, -7 }, /* (233) cmd ::= ALTER TABLE ids cpxName DROP TAG ids */
+ { 210, -8 }, /* (234) cmd ::= ALTER TABLE ids cpxName CHANGE TAG ids ids */
+ { 210, -9 }, /* (235) cmd ::= ALTER TABLE ids cpxName SET TAG ids EQ tagitem */
+ { 210, -3 }, /* (236) cmd ::= KILL CONNECTION INTEGER */
+ { 210, -5 }, /* (237) cmd ::= KILL STREAM INTEGER COLON INTEGER */
+ { 210, -5 }, /* (238) cmd ::= KILL QUERY INTEGER COLON INTEGER */
};
static void yy_accept(yyParser*); /* Forward Declaration */
@@ -2027,7 +2038,7 @@ static void yy_reduce(
/********** Begin reduce actions **********************************************/
YYMINORTYPE yylhsminor;
case 0: /* program ::= cmd */
- case 115: /* cmd ::= CREATE TABLE create_table_args */ yytestcase(yyruleno==115);
+ case 118: /* cmd ::= CREATE TABLE create_table_args */ yytestcase(yyruleno==118);
{}
break;
case 1: /* cmd ::= SHOW DATABASES */
@@ -2139,8 +2150,7 @@ static void yy_reduce(
}
break;
case 28: /* cmd ::= DROP DATABASE ifexists ids */
-{
- setDropDbTableInfo(pInfo, TSDB_SQL_DROP_DB, &yymsp[0].minor.yy0, &yymsp[-1].minor.yy0); }
+{ setDropDbTableInfo(pInfo, TSDB_SQL_DROP_DB, &yymsp[0].minor.yy0, &yymsp[-1].minor.yy0); }
break;
case 29: /* cmd ::= DROP DNODE ids */
{ setDCLSQLElems(pInfo, TSDB_SQL_DROP_DNODE, 1, &yymsp[0].minor.yy0); }
@@ -2161,12 +2171,10 @@ static void yy_reduce(
}
break;
case 34: /* cmd ::= ALTER USER ids PASS ids */
-{
- setAlterUserSql(pInfo, TSDB_ALTER_USER_PASSWD, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, NULL); }
+{ setAlterUserSql(pInfo, TSDB_ALTER_USER_PASSWD, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, NULL); }
break;
case 35: /* cmd ::= ALTER USER ids PRIVILEGE ids */
-{
- setAlterUserSql(pInfo, TSDB_ALTER_USER_PRIVILEGES, &yymsp[-2].minor.yy0, NULL, &yymsp[0].minor.yy0);}
+{ setAlterUserSql(pInfo, TSDB_ALTER_USER_PRIVILEGES, &yymsp[-2].minor.yy0, NULL, &yymsp[0].minor.yy0);}
break;
case 36: /* cmd ::= ALTER DNODE ids ids */
{ setDCLSQLElems(pInfo, TSDB_SQL_CFG_DNODE, 2, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0); }
@@ -2181,15 +2189,13 @@ static void yy_reduce(
{ setDCLSQLElems(pInfo, TSDB_SQL_CFG_LOCAL, 2, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0); }
break;
case 40: /* cmd ::= ALTER DATABASE ids alter_db_optr */
-{ SStrToken t = {0}; setCreateDBSQL(pInfo, TSDB_SQL_ALTER_DB, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy148, &t);}
+{ SStrToken t = {0}; setCreateDBSQL(pInfo, TSDB_SQL_ALTER_DB, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy478, &t);}
break;
case 41: /* cmd ::= ALTER ACCOUNT ids acct_optr */
-{
- setCreateAcctSql(pInfo, TSDB_SQL_ALTER_ACCT, &yymsp[-1].minor.yy0, NULL, &yymsp[0].minor.yy309);}
+{ setCreateAcctSql(pInfo, TSDB_SQL_ALTER_ACCT, &yymsp[-1].minor.yy0, NULL, &yymsp[0].minor.yy463);}
break;
case 42: /* cmd ::= ALTER ACCOUNT ids PASS ids acct_optr */
-{
- setCreateAcctSql(pInfo, TSDB_SQL_ALTER_ACCT, &yymsp[-3].minor.yy0, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy309);}
+{ setCreateAcctSql(pInfo, TSDB_SQL_ALTER_ACCT, &yymsp[-3].minor.yy0, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy463);}
break;
case 43: /* ids ::= ID */
case 44: /* ids ::= STRING */ yytestcase(yyruleno==44);
@@ -2210,16 +2216,13 @@ static void yy_reduce(
{ setDCLSQLElems(pInfo, TSDB_SQL_CREATE_DNODE, 1, &yymsp[0].minor.yy0);}
break;
case 50: /* cmd ::= CREATE ACCOUNT ids PASS ids acct_optr */
-{
- setCreateAcctSql(pInfo, TSDB_SQL_CREATE_ACCT, &yymsp[-3].minor.yy0, &yymsp[-1].minor.yy0,
- &yymsp[0].minor.yy309);}
+{ setCreateAcctSql(pInfo, TSDB_SQL_CREATE_ACCT, &yymsp[-3].minor.yy0, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy463);}
break;
case 51: /* cmd ::= CREATE DATABASE ifnotexists ids db_optr */
-{ setCreateDBSQL(pInfo, TSDB_SQL_CREATE_DB, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy148, &yymsp[-2].minor.yy0);}
+{ setCreateDBSQL(pInfo, TSDB_SQL_CREATE_DB, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy478, &yymsp[-2].minor.yy0);}
break;
case 52: /* cmd ::= CREATE USER ids PASS ids */
-{
- setCreateUserSql(pInfo, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0);}
+{ setCreateUserSql(pInfo, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0);}
break;
case 53: /* pps ::= */
case 55: /* tseries ::= */ yytestcase(yyruleno==55);
@@ -2245,20 +2248,20 @@ static void yy_reduce(
break;
case 71: /* acct_optr ::= pps tseries storage streams qtime dbs users conns state */
{
- yylhsminor.yy309.maxUsers = (yymsp[-2].minor.yy0.n>0)?atoi(yymsp[-2].minor.yy0.z):-1;
- yylhsminor.yy309.maxDbs = (yymsp[-3].minor.yy0.n>0)?atoi(yymsp[-3].minor.yy0.z):-1;
- yylhsminor.yy309.maxTimeSeries = (yymsp[-7].minor.yy0.n>0)?atoi(yymsp[-7].minor.yy0.z):-1;
- yylhsminor.yy309.maxStreams = (yymsp[-5].minor.yy0.n>0)?atoi(yymsp[-5].minor.yy0.z):-1;
- yylhsminor.yy309.maxPointsPerSecond = (yymsp[-8].minor.yy0.n>0)?atoi(yymsp[-8].minor.yy0.z):-1;
- yylhsminor.yy309.maxStorage = (yymsp[-6].minor.yy0.n>0)?strtoll(yymsp[-6].minor.yy0.z, NULL, 10):-1;
- yylhsminor.yy309.maxQueryTime = (yymsp[-4].minor.yy0.n>0)?strtoll(yymsp[-4].minor.yy0.z, NULL, 10):-1;
- yylhsminor.yy309.maxConnections = (yymsp[-1].minor.yy0.n>0)?atoi(yymsp[-1].minor.yy0.z):-1;
- yylhsminor.yy309.stat = yymsp[0].minor.yy0;
+ yylhsminor.yy463.maxUsers = (yymsp[-2].minor.yy0.n>0)?atoi(yymsp[-2].minor.yy0.z):-1;
+ yylhsminor.yy463.maxDbs = (yymsp[-3].minor.yy0.n>0)?atoi(yymsp[-3].minor.yy0.z):-1;
+ yylhsminor.yy463.maxTimeSeries = (yymsp[-7].minor.yy0.n>0)?atoi(yymsp[-7].minor.yy0.z):-1;
+ yylhsminor.yy463.maxStreams = (yymsp[-5].minor.yy0.n>0)?atoi(yymsp[-5].minor.yy0.z):-1;
+ yylhsminor.yy463.maxPointsPerSecond = (yymsp[-8].minor.yy0.n>0)?atoi(yymsp[-8].minor.yy0.z):-1;
+ yylhsminor.yy463.maxStorage = (yymsp[-6].minor.yy0.n>0)?strtoll(yymsp[-6].minor.yy0.z, NULL, 10):-1;
+ yylhsminor.yy463.maxQueryTime = (yymsp[-4].minor.yy0.n>0)?strtoll(yymsp[-4].minor.yy0.z, NULL, 10):-1;
+ yylhsminor.yy463.maxConnections = (yymsp[-1].minor.yy0.n>0)?atoi(yymsp[-1].minor.yy0.z):-1;
+ yylhsminor.yy463.stat = yymsp[0].minor.yy0;
}
- yymsp[-8].minor.yy309 = yylhsminor.yy309;
+ yymsp[-8].minor.yy463 = yylhsminor.yy463;
break;
case 72: /* keep ::= KEEP tagitemlist */
-{ yymsp[-1].minor.yy131 = yymsp[0].minor.yy131; }
+{ yymsp[-1].minor.yy403 = yymsp[0].minor.yy403; }
break;
case 73: /* cache ::= CACHE INTEGER */
case 74: /* replica ::= REPLICA INTEGER */ yytestcase(yyruleno==74);
@@ -2273,591 +2276,588 @@ static void yy_reduce(
case 83: /* comp ::= COMP INTEGER */ yytestcase(yyruleno==83);
case 84: /* prec ::= PRECISION STRING */ yytestcase(yyruleno==84);
case 85: /* update ::= UPDATE INTEGER */ yytestcase(yyruleno==85);
+ case 86: /* cachelast ::= CACHELAST INTEGER */ yytestcase(yyruleno==86);
{ yymsp[-1].minor.yy0 = yymsp[0].minor.yy0; }
break;
- case 86: /* db_optr ::= */
-{setDefaultCreateDbOption(&yymsp[1].minor.yy148);}
+ case 87: /* db_optr ::= */
+{setDefaultCreateDbOption(&yymsp[1].minor.yy478);}
break;
- case 87: /* db_optr ::= db_optr cache */
-{ yylhsminor.yy148 = yymsp[-1].minor.yy148; yylhsminor.yy148.cacheBlockSize = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
- yymsp[-1].minor.yy148 = yylhsminor.yy148;
+ case 88: /* db_optr ::= db_optr cache */
+{ yylhsminor.yy478 = yymsp[-1].minor.yy478; yylhsminor.yy478.cacheBlockSize = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
+ yymsp[-1].minor.yy478 = yylhsminor.yy478;
break;
- case 88: /* db_optr ::= db_optr replica */
- case 102: /* alter_db_optr ::= alter_db_optr replica */ yytestcase(yyruleno==102);
-{ yylhsminor.yy148 = yymsp[-1].minor.yy148; yylhsminor.yy148.replica = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
- yymsp[-1].minor.yy148 = yylhsminor.yy148;
+ case 89: /* db_optr ::= db_optr replica */
+ case 104: /* alter_db_optr ::= alter_db_optr replica */ yytestcase(yyruleno==104);
+{ yylhsminor.yy478 = yymsp[-1].minor.yy478; yylhsminor.yy478.replica = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
+ yymsp[-1].minor.yy478 = yylhsminor.yy478;
break;
- case 89: /* db_optr ::= db_optr quorum */
- case 103: /* alter_db_optr ::= alter_db_optr quorum */ yytestcase(yyruleno==103);
-{ yylhsminor.yy148 = yymsp[-1].minor.yy148; yylhsminor.yy148.quorum = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
- yymsp[-1].minor.yy148 = yylhsminor.yy148;
+ case 90: /* db_optr ::= db_optr quorum */
+ case 105: /* alter_db_optr ::= alter_db_optr quorum */ yytestcase(yyruleno==105);
+{ yylhsminor.yy478 = yymsp[-1].minor.yy478; yylhsminor.yy478.quorum = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
+ yymsp[-1].minor.yy478 = yylhsminor.yy478;
break;
- case 90: /* db_optr ::= db_optr days */
-{ yylhsminor.yy148 = yymsp[-1].minor.yy148; yylhsminor.yy148.daysPerFile = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
- yymsp[-1].minor.yy148 = yylhsminor.yy148;
+ case 91: /* db_optr ::= db_optr days */
+{ yylhsminor.yy478 = yymsp[-1].minor.yy478; yylhsminor.yy478.daysPerFile = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
+ yymsp[-1].minor.yy478 = yylhsminor.yy478;
break;
- case 91: /* db_optr ::= db_optr minrows */
-{ yylhsminor.yy148 = yymsp[-1].minor.yy148; yylhsminor.yy148.minRowsPerBlock = strtod(yymsp[0].minor.yy0.z, NULL); }
- yymsp[-1].minor.yy148 = yylhsminor.yy148;
+ case 92: /* db_optr ::= db_optr minrows */
+{ yylhsminor.yy478 = yymsp[-1].minor.yy478; yylhsminor.yy478.minRowsPerBlock = strtod(yymsp[0].minor.yy0.z, NULL); }
+ yymsp[-1].minor.yy478 = yylhsminor.yy478;
break;
- case 92: /* db_optr ::= db_optr maxrows */
-{ yylhsminor.yy148 = yymsp[-1].minor.yy148; yylhsminor.yy148.maxRowsPerBlock = strtod(yymsp[0].minor.yy0.z, NULL); }
- yymsp[-1].minor.yy148 = yylhsminor.yy148;
+ case 93: /* db_optr ::= db_optr maxrows */
+{ yylhsminor.yy478 = yymsp[-1].minor.yy478; yylhsminor.yy478.maxRowsPerBlock = strtod(yymsp[0].minor.yy0.z, NULL); }
+ yymsp[-1].minor.yy478 = yylhsminor.yy478;
break;
- case 93: /* db_optr ::= db_optr blocks */
- case 105: /* alter_db_optr ::= alter_db_optr blocks */ yytestcase(yyruleno==105);
-{ yylhsminor.yy148 = yymsp[-1].minor.yy148; yylhsminor.yy148.numOfBlocks = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
- yymsp[-1].minor.yy148 = yylhsminor.yy148;
+ case 94: /* db_optr ::= db_optr blocks */
+ case 107: /* alter_db_optr ::= alter_db_optr blocks */ yytestcase(yyruleno==107);
+{ yylhsminor.yy478 = yymsp[-1].minor.yy478; yylhsminor.yy478.numOfBlocks = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
+ yymsp[-1].minor.yy478 = yylhsminor.yy478;
break;
- case 94: /* db_optr ::= db_optr ctime */
-{ yylhsminor.yy148 = yymsp[-1].minor.yy148; yylhsminor.yy148.commitTime = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
- yymsp[-1].minor.yy148 = yylhsminor.yy148;
+ case 95: /* db_optr ::= db_optr ctime */
+{ yylhsminor.yy478 = yymsp[-1].minor.yy478; yylhsminor.yy478.commitTime = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
+ yymsp[-1].minor.yy478 = yylhsminor.yy478;
break;
- case 95: /* db_optr ::= db_optr wal */
- case 107: /* alter_db_optr ::= alter_db_optr wal */ yytestcase(yyruleno==107);
-{ yylhsminor.yy148 = yymsp[-1].minor.yy148; yylhsminor.yy148.walLevel = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
- yymsp[-1].minor.yy148 = yylhsminor.yy148;
+ case 96: /* db_optr ::= db_optr wal */
+ case 109: /* alter_db_optr ::= alter_db_optr wal */ yytestcase(yyruleno==109);
+{ yylhsminor.yy478 = yymsp[-1].minor.yy478; yylhsminor.yy478.walLevel = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
+ yymsp[-1].minor.yy478 = yylhsminor.yy478;
break;
- case 96: /* db_optr ::= db_optr fsync */
- case 108: /* alter_db_optr ::= alter_db_optr fsync */ yytestcase(yyruleno==108);
-{ yylhsminor.yy148 = yymsp[-1].minor.yy148; yylhsminor.yy148.fsyncPeriod = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
- yymsp[-1].minor.yy148 = yylhsminor.yy148;
+ case 97: /* db_optr ::= db_optr fsync */
+ case 110: /* alter_db_optr ::= alter_db_optr fsync */ yytestcase(yyruleno==110);
+{ yylhsminor.yy478 = yymsp[-1].minor.yy478; yylhsminor.yy478.fsyncPeriod = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
+ yymsp[-1].minor.yy478 = yylhsminor.yy478;
break;
- case 97: /* db_optr ::= db_optr comp */
- case 106: /* alter_db_optr ::= alter_db_optr comp */ yytestcase(yyruleno==106);
-{ yylhsminor.yy148 = yymsp[-1].minor.yy148; yylhsminor.yy148.compressionLevel = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
- yymsp[-1].minor.yy148 = yylhsminor.yy148;
+ case 98: /* db_optr ::= db_optr comp */
+ case 108: /* alter_db_optr ::= alter_db_optr comp */ yytestcase(yyruleno==108);
+{ yylhsminor.yy478 = yymsp[-1].minor.yy478; yylhsminor.yy478.compressionLevel = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
+ yymsp[-1].minor.yy478 = yylhsminor.yy478;
break;
- case 98: /* db_optr ::= db_optr prec */
-{ yylhsminor.yy148 = yymsp[-1].minor.yy148; yylhsminor.yy148.precision = yymsp[0].minor.yy0; }
- yymsp[-1].minor.yy148 = yylhsminor.yy148;
+ case 99: /* db_optr ::= db_optr prec */
+{ yylhsminor.yy478 = yymsp[-1].minor.yy478; yylhsminor.yy478.precision = yymsp[0].minor.yy0; }
+ yymsp[-1].minor.yy478 = yylhsminor.yy478;
break;
- case 99: /* db_optr ::= db_optr keep */
- case 104: /* alter_db_optr ::= alter_db_optr keep */ yytestcase(yyruleno==104);
-{ yylhsminor.yy148 = yymsp[-1].minor.yy148; yylhsminor.yy148.keep = yymsp[0].minor.yy131; }
- yymsp[-1].minor.yy148 = yylhsminor.yy148;
+ case 100: /* db_optr ::= db_optr keep */
+ case 106: /* alter_db_optr ::= alter_db_optr keep */ yytestcase(yyruleno==106);
+{ yylhsminor.yy478 = yymsp[-1].minor.yy478; yylhsminor.yy478.keep = yymsp[0].minor.yy403; }
+ yymsp[-1].minor.yy478 = yylhsminor.yy478;
break;
- case 100: /* db_optr ::= db_optr update */
- case 109: /* alter_db_optr ::= alter_db_optr update */ yytestcase(yyruleno==109);
-{ yylhsminor.yy148 = yymsp[-1].minor.yy148; yylhsminor.yy148.update = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
- yymsp[-1].minor.yy148 = yylhsminor.yy148;
+ case 101: /* db_optr ::= db_optr update */
+ case 111: /* alter_db_optr ::= alter_db_optr update */ yytestcase(yyruleno==111);
+{ yylhsminor.yy478 = yymsp[-1].minor.yy478; yylhsminor.yy478.update = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
+ yymsp[-1].minor.yy478 = yylhsminor.yy478;
break;
- case 101: /* alter_db_optr ::= */
-{ setDefaultCreateDbOption(&yymsp[1].minor.yy148);}
+ case 102: /* db_optr ::= db_optr cachelast */
+ case 112: /* alter_db_optr ::= alter_db_optr cachelast */ yytestcase(yyruleno==112);
+{ yylhsminor.yy478 = yymsp[-1].minor.yy478; yylhsminor.yy478.cachelast = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
+ yymsp[-1].minor.yy478 = yylhsminor.yy478;
break;
- case 110: /* typename ::= ids */
+ case 103: /* alter_db_optr ::= */
+{ setDefaultCreateDbOption(&yymsp[1].minor.yy478);}
+ break;
+ case 113: /* typename ::= ids */
{
yymsp[0].minor.yy0.type = 0;
- tSqlSetColumnType(&yylhsminor.yy163, &yymsp[0].minor.yy0);
+ tSqlSetColumnType (&yylhsminor.yy363, &yymsp[0].minor.yy0);
}
- yymsp[0].minor.yy163 = yylhsminor.yy163;
+ yymsp[0].minor.yy363 = yylhsminor.yy363;
break;
- case 111: /* typename ::= ids LP signed RP */
+ case 114: /* typename ::= ids LP signed RP */
{
- if (yymsp[-1].minor.yy459 <= 0) {
+ if (yymsp[-1].minor.yy387 <= 0) {
yymsp[-3].minor.yy0.type = 0;
- tSqlSetColumnType(&yylhsminor.yy163, &yymsp[-3].minor.yy0);
+ tSqlSetColumnType(&yylhsminor.yy363, &yymsp[-3].minor.yy0);
} else {
- yymsp[-3].minor.yy0.type = -yymsp[-1].minor.yy459; // negative value of name length
- tSqlSetColumnType(&yylhsminor.yy163, &yymsp[-3].minor.yy0);
+ yymsp[-3].minor.yy0.type = -yymsp[-1].minor.yy387; // negative value of name length
+ tSqlSetColumnType(&yylhsminor.yy363, &yymsp[-3].minor.yy0);
}
}
- yymsp[-3].minor.yy163 = yylhsminor.yy163;
+ yymsp[-3].minor.yy363 = yylhsminor.yy363;
break;
- case 112: /* signed ::= INTEGER */
-{ yylhsminor.yy459 = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
- yymsp[0].minor.yy459 = yylhsminor.yy459;
+ case 115: /* signed ::= INTEGER */
+{ yylhsminor.yy387 = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
+ yymsp[0].minor.yy387 = yylhsminor.yy387;
break;
- case 113: /* signed ::= PLUS INTEGER */
-{ yymsp[-1].minor.yy459 = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
+ case 116: /* signed ::= PLUS INTEGER */
+{ yymsp[-1].minor.yy387 = strtol(yymsp[0].minor.yy0.z, NULL, 10); }
break;
- case 114: /* signed ::= MINUS INTEGER */
-{ yymsp[-1].minor.yy459 = -strtol(yymsp[0].minor.yy0.z, NULL, 10);}
+ case 117: /* signed ::= MINUS INTEGER */
+{ yymsp[-1].minor.yy387 = -strtol(yymsp[0].minor.yy0.z, NULL, 10);}
break;
- case 116: /* cmd ::= CREATE TABLE create_table_list */
-{ pInfo->type = TSDB_SQL_CREATE_TABLE; pInfo->pCreateTableInfo = yymsp[0].minor.yy538;}
+ case 119: /* cmd ::= CREATE TABLE create_table_list */
+{ pInfo->type = TSDB_SQL_CREATE_TABLE; pInfo->pCreateTableInfo = yymsp[0].minor.yy436;}
break;
- case 117: /* create_table_list ::= create_from_stable */
+ case 120: /* create_table_list ::= create_from_stable */
{
SCreateTableSQL* pCreateTable = calloc(1, sizeof(SCreateTableSQL));
pCreateTable->childTableInfo = taosArrayInit(4, sizeof(SCreatedTableInfo));
- taosArrayPush(pCreateTable->childTableInfo, &yymsp[0].minor.yy96);
+ taosArrayPush(pCreateTable->childTableInfo, &yymsp[0].minor.yy84);
pCreateTable->type = TSQL_CREATE_TABLE_FROM_STABLE;
- yylhsminor.yy538 = pCreateTable;
+ yylhsminor.yy436 = pCreateTable;
}
- yymsp[0].minor.yy538 = yylhsminor.yy538;
+ yymsp[0].minor.yy436 = yylhsminor.yy436;
break;
- case 118: /* create_table_list ::= create_table_list create_from_stable */
+ case 121: /* create_table_list ::= create_table_list create_from_stable */
{
- taosArrayPush(yymsp[-1].minor.yy538->childTableInfo, &yymsp[0].minor.yy96);
- yylhsminor.yy538 = yymsp[-1].minor.yy538;
+ taosArrayPush(yymsp[-1].minor.yy436->childTableInfo, &yymsp[0].minor.yy84);
+ yylhsminor.yy436 = yymsp[-1].minor.yy436;
}
- yymsp[-1].minor.yy538 = yylhsminor.yy538;
+ yymsp[-1].minor.yy436 = yylhsminor.yy436;
break;
- case 119: /* create_table_args ::= ifnotexists ids cpxName LP columnlist RP */
+ case 122: /* create_table_args ::= ifnotexists ids cpxName LP columnlist RP */
{
- yylhsminor.yy538 = tSetCreateSqlElems(yymsp[-1].minor.yy131, NULL, NULL, TSQL_CREATE_TABLE);
- setSqlInfo(pInfo, yylhsminor.yy538, NULL, TSDB_SQL_CREATE_TABLE);
+ yylhsminor.yy436 = tSetCreateSqlElems(yymsp[-1].minor.yy403, NULL, NULL, TSQL_CREATE_TABLE);
+ setSqlInfo(pInfo, yylhsminor.yy436, NULL, TSDB_SQL_CREATE_TABLE);
yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n;
setCreatedTableName(pInfo, &yymsp[-4].minor.yy0, &yymsp[-5].minor.yy0);
}
- yymsp[-5].minor.yy538 = yylhsminor.yy538;
+ yymsp[-5].minor.yy436 = yylhsminor.yy436;
break;
- case 120: /* create_table_args ::= ifnotexists ids cpxName LP columnlist RP TAGS LP columnlist RP */
+ case 123: /* create_table_args ::= ifnotexists ids cpxName LP columnlist RP TAGS LP columnlist RP */
{
- yylhsminor.yy538 = tSetCreateSqlElems(yymsp[-5].minor.yy131, yymsp[-1].minor.yy131, NULL, TSQL_CREATE_STABLE);
- setSqlInfo(pInfo, yylhsminor.yy538, NULL, TSDB_SQL_CREATE_TABLE);
+ yylhsminor.yy436 = tSetCreateSqlElems(yymsp[-5].minor.yy403, yymsp[-1].minor.yy403, NULL, TSQL_CREATE_STABLE);
+ setSqlInfo(pInfo, yylhsminor.yy436, NULL, TSDB_SQL_CREATE_TABLE);
yymsp[-8].minor.yy0.n += yymsp[-7].minor.yy0.n;
setCreatedTableName(pInfo, &yymsp[-8].minor.yy0, &yymsp[-9].minor.yy0);
}
- yymsp[-9].minor.yy538 = yylhsminor.yy538;
+ yymsp[-9].minor.yy436 = yylhsminor.yy436;
break;
- case 121: /* create_from_stable ::= ifnotexists ids cpxName USING ids cpxName TAGS LP tagitemlist RP */
+ case 124: /* create_from_stable ::= ifnotexists ids cpxName USING ids cpxName TAGS LP tagitemlist RP */
{
yymsp[-5].minor.yy0.n += yymsp[-4].minor.yy0.n;
yymsp[-8].minor.yy0.n += yymsp[-7].minor.yy0.n;
- yylhsminor.yy96 = createNewChildTableInfo(&yymsp[-5].minor.yy0, yymsp[-1].minor.yy131, &yymsp[-8].minor.yy0, &yymsp[-9].minor.yy0);
+ yylhsminor.yy84 = createNewChildTableInfo(&yymsp[-5].minor.yy0, yymsp[-1].minor.yy403, &yymsp[-8].minor.yy0, &yymsp[-9].minor.yy0);
}
- yymsp[-9].minor.yy96 = yylhsminor.yy96;
+ yymsp[-9].minor.yy84 = yylhsminor.yy84;
break;
- case 122: /* create_table_args ::= ifnotexists ids cpxName AS select */
+ case 125: /* create_table_args ::= ifnotexists ids cpxName AS select */
{
- yylhsminor.yy538 = tSetCreateSqlElems(NULL, NULL, yymsp[0].minor.yy84, TSQL_CREATE_STREAM);
- setSqlInfo(pInfo, yylhsminor.yy538, NULL, TSDB_SQL_CREATE_TABLE);
+ yylhsminor.yy436 = tSetCreateSqlElems(NULL, NULL, yymsp[0].minor.yy4, TSQL_CREATE_STREAM);
+ setSqlInfo(pInfo, yylhsminor.yy436, NULL, TSDB_SQL_CREATE_TABLE);
yymsp[-3].minor.yy0.n += yymsp[-2].minor.yy0.n;
setCreatedTableName(pInfo, &yymsp[-3].minor.yy0, &yymsp[-4].minor.yy0);
}
- yymsp[-4].minor.yy538 = yylhsminor.yy538;
+ yymsp[-4].minor.yy436 = yylhsminor.yy436;
break;
- case 123: /* columnlist ::= columnlist COMMA column */
-{taosArrayPush(yymsp[-2].minor.yy131, &yymsp[0].minor.yy163); yylhsminor.yy131 = yymsp[-2].minor.yy131; }
- yymsp[-2].minor.yy131 = yylhsminor.yy131;
+ case 126: /* columnlist ::= columnlist COMMA column */
+{taosArrayPush(yymsp[-2].minor.yy403, &yymsp[0].minor.yy363); yylhsminor.yy403 = yymsp[-2].minor.yy403; }
+ yymsp[-2].minor.yy403 = yylhsminor.yy403;
break;
- case 124: /* columnlist ::= column */
-{yylhsminor.yy131 = taosArrayInit(4, sizeof(TAOS_FIELD)); taosArrayPush(yylhsminor.yy131, &yymsp[0].minor.yy163);}
- yymsp[0].minor.yy131 = yylhsminor.yy131;
+ case 127: /* columnlist ::= column */
+{yylhsminor.yy403 = taosArrayInit(4, sizeof(TAOS_FIELD)); taosArrayPush(yylhsminor.yy403, &yymsp[0].minor.yy363);}
+ yymsp[0].minor.yy403 = yylhsminor.yy403;
break;
- case 125: /* column ::= ids typename */
+ case 128: /* column ::= ids typename */
{
- tSqlSetColumnInfo(&yylhsminor.yy163, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy163);
+ tSqlSetColumnInfo(&yylhsminor.yy363, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy363);
}
- yymsp[-1].minor.yy163 = yylhsminor.yy163;
+ yymsp[-1].minor.yy363 = yylhsminor.yy363;
break;
- case 126: /* tagitemlist ::= tagitemlist COMMA tagitem */
-{ yylhsminor.yy131 = tVariantListAppend(yymsp[-2].minor.yy131, &yymsp[0].minor.yy516, -1); }
- yymsp[-2].minor.yy131 = yylhsminor.yy131;
+ case 129: /* tagitemlist ::= tagitemlist COMMA tagitem */
+{ yylhsminor.yy403 = tVariantListAppend(yymsp[-2].minor.yy403, &yymsp[0].minor.yy488, -1); }
+ yymsp[-2].minor.yy403 = yylhsminor.yy403;
break;
- case 127: /* tagitemlist ::= tagitem */
-{ yylhsminor.yy131 = tVariantListAppend(NULL, &yymsp[0].minor.yy516, -1); }
- yymsp[0].minor.yy131 = yylhsminor.yy131;
+ case 130: /* tagitemlist ::= tagitem */
+{ yylhsminor.yy403 = tVariantListAppend(NULL, &yymsp[0].minor.yy488, -1); }
+ yymsp[0].minor.yy403 = yylhsminor.yy403;
break;
- case 128: /* tagitem ::= INTEGER */
- case 129: /* tagitem ::= FLOAT */ yytestcase(yyruleno==129);
- case 130: /* tagitem ::= STRING */ yytestcase(yyruleno==130);
- case 131: /* tagitem ::= BOOL */ yytestcase(yyruleno==131);
-{ toTSDBType(yymsp[0].minor.yy0.type); tVariantCreate(&yylhsminor.yy516, &yymsp[0].minor.yy0); }
- yymsp[0].minor.yy516 = yylhsminor.yy516;
+ case 131: /* tagitem ::= INTEGER */
+ case 132: /* tagitem ::= FLOAT */ yytestcase(yyruleno==132);
+ case 133: /* tagitem ::= STRING */ yytestcase(yyruleno==133);
+ case 134: /* tagitem ::= BOOL */ yytestcase(yyruleno==134);
+{ toTSDBType(yymsp[0].minor.yy0.type); tVariantCreate(&yylhsminor.yy488, &yymsp[0].minor.yy0); }
+ yymsp[0].minor.yy488 = yylhsminor.yy488;
break;
- case 132: /* tagitem ::= NULL */
-{ yymsp[0].minor.yy0.type = 0; tVariantCreate(&yylhsminor.yy516, &yymsp[0].minor.yy0); }
- yymsp[0].minor.yy516 = yylhsminor.yy516;
+ case 135: /* tagitem ::= NULL */
+{ yymsp[0].minor.yy0.type = 0; tVariantCreate(&yylhsminor.yy488, &yymsp[0].minor.yy0); }
+ yymsp[0].minor.yy488 = yylhsminor.yy488;
break;
- case 133: /* tagitem ::= MINUS INTEGER */
- case 134: /* tagitem ::= MINUS FLOAT */ yytestcase(yyruleno==134);
- case 135: /* tagitem ::= PLUS INTEGER */ yytestcase(yyruleno==135);
- case 136: /* tagitem ::= PLUS FLOAT */ yytestcase(yyruleno==136);
+ case 136: /* tagitem ::= MINUS INTEGER */
+ case 137: /* tagitem ::= MINUS FLOAT */ yytestcase(yyruleno==137);
+ case 138: /* tagitem ::= PLUS INTEGER */ yytestcase(yyruleno==138);
+ case 139: /* tagitem ::= PLUS FLOAT */ yytestcase(yyruleno==139);
{
yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n;
yymsp[-1].minor.yy0.type = yymsp[0].minor.yy0.type;
toTSDBType(yymsp[-1].minor.yy0.type);
- tVariantCreate(&yylhsminor.yy516, &yymsp[-1].minor.yy0);
+ tVariantCreate(&yylhsminor.yy488, &yymsp[-1].minor.yy0);
}
- yymsp[-1].minor.yy516 = yylhsminor.yy516;
+ yymsp[-1].minor.yy488 = yylhsminor.yy488;
break;
- case 137: /* select ::= SELECT selcollist from where_opt interval_opt fill_opt sliding_opt groupby_opt orderby_opt having_opt slimit_opt limit_opt */
+ case 140: /* select ::= SELECT selcollist from where_opt interval_opt fill_opt sliding_opt groupby_opt orderby_opt having_opt slimit_opt limit_opt */
{
- yylhsminor.yy84 = tSetQuerySqlElems(&yymsp[-11].minor.yy0, yymsp[-10].minor.yy478, yymsp[-9].minor.yy131,
- yymsp[-8].minor.yy420, yymsp[-4].minor.yy131, yymsp[-3].minor.yy131,
- &yymsp[-7].minor.yy530, &yymsp[-5].minor.yy0, yymsp[-6].minor.yy131,
- &yymsp[0].minor.yy284, &yymsp[-1].minor.yy284);
+ yylhsminor.yy4 = tSetQuerySqlElems(&yymsp[-11].minor.yy0, yymsp[-10].minor.yy382, yymsp[-9].minor.yy403, yymsp[-8].minor.yy522, yymsp[-4].minor.yy403, yymsp[-3].minor.yy403, &yymsp[-7].minor.yy222, &yymsp[-5].minor.yy0, yymsp[-6].minor.yy403, &yymsp[0].minor.yy404, &yymsp[-1].minor.yy404);
}
- yymsp[-11].minor.yy84 = yylhsminor.yy84;
+ yymsp[-11].minor.yy4 = yylhsminor.yy4;
break;
- case 138: /* union ::= select */
-{ yylhsminor.yy513 = setSubclause(NULL, yymsp[0].minor.yy84); }
- yymsp[0].minor.yy513 = yylhsminor.yy513;
+ case 141: /* union ::= select */
+{ yylhsminor.yy13 = setSubclause(NULL, yymsp[0].minor.yy4); }
+ yymsp[0].minor.yy13 = yylhsminor.yy13;
break;
- case 139: /* union ::= LP union RP */
-{ yymsp[-2].minor.yy513 = yymsp[-1].minor.yy513; }
+ case 142: /* union ::= LP union RP */
+{ yymsp[-2].minor.yy13 = yymsp[-1].minor.yy13; }
break;
- case 140: /* union ::= union UNION ALL select */
-{ yylhsminor.yy513 = appendSelectClause(yymsp[-3].minor.yy513, yymsp[0].minor.yy84); }
- yymsp[-3].minor.yy513 = yylhsminor.yy513;
+ case 143: /* union ::= union UNION ALL select */
+{ yylhsminor.yy13 = appendSelectClause(yymsp[-3].minor.yy13, yymsp[0].minor.yy4); }
+ yymsp[-3].minor.yy13 = yylhsminor.yy13;
break;
- case 141: /* union ::= union UNION ALL LP select RP */
-{ yylhsminor.yy513 = appendSelectClause(yymsp[-5].minor.yy513, yymsp[-1].minor.yy84); }
- yymsp[-5].minor.yy513 = yylhsminor.yy513;
+ case 144: /* union ::= union UNION ALL LP select RP */
+{ yylhsminor.yy13 = appendSelectClause(yymsp[-5].minor.yy13, yymsp[-1].minor.yy4); }
+ yymsp[-5].minor.yy13 = yylhsminor.yy13;
break;
- case 142: /* cmd ::= union */
+ case 145: /* cmd ::= union */
+{ setSqlInfo(pInfo, yymsp[0].minor.yy13, NULL, TSDB_SQL_SELECT); }
+ break;
+ case 146: /* select ::= SELECT selcollist */
{
- setSqlInfo(pInfo, yymsp[0].minor.yy513, NULL, TSDB_SQL_SELECT); }
- break;
- case 143: /* select ::= SELECT selcollist */
-{
- yylhsminor.yy84 = tSetQuerySqlElems(&yymsp[-1].minor.yy0, yymsp[0].minor.yy478, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL);
+ yylhsminor.yy4 = tSetQuerySqlElems(&yymsp[-1].minor.yy0, yymsp[0].minor.yy382, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
}
- yymsp[-1].minor.yy84 = yylhsminor.yy84;
+ yymsp[-1].minor.yy4 = yylhsminor.yy4;
break;
- case 144: /* sclp ::= selcollist COMMA */
-{yylhsminor.yy478 = yymsp[-1].minor.yy478;}
- yymsp[-1].minor.yy478 = yylhsminor.yy478;
+ case 147: /* sclp ::= selcollist COMMA */
+{yylhsminor.yy382 = yymsp[-1].minor.yy382;}
+ yymsp[-1].minor.yy382 = yylhsminor.yy382;
break;
- case 145: /* sclp ::= */
-{yymsp[1].minor.yy478 = 0;}
+ case 148: /* sclp ::= */
+{yymsp[1].minor.yy382 = 0;}
break;
- case 146: /* selcollist ::= sclp expr as */
+ case 149: /* selcollist ::= sclp expr as */
{
- yylhsminor.yy478 = tSqlExprListAppend(yymsp[-2].minor.yy478, yymsp[-1].minor.yy420,
- yymsp[0].minor.yy0.n ? &yymsp[0].minor.yy0 : 0);
+ yylhsminor.yy382 = tSqlExprListAppend(yymsp[-2].minor.yy382, yymsp[-1].minor.yy522, yymsp[0].minor.yy0.n?&yymsp[0].minor.yy0:0);
}
- yymsp[-2].minor.yy478 = yylhsminor.yy478;
+ yymsp[-2].minor.yy382 = yylhsminor.yy382;
break;
- case 147: /* selcollist ::= sclp STAR */
+ case 150: /* selcollist ::= sclp STAR */
{
tSQLExpr *pNode = tSqlExprIdValueCreate(NULL, TK_ALL);
- yylhsminor.yy478 = tSqlExprListAppend(yymsp[-1].minor.yy478, pNode, 0);
+ yylhsminor.yy382 = tSqlExprListAppend(yymsp[-1].minor.yy382, pNode, 0);
}
- yymsp[-1].minor.yy478 = yylhsminor.yy478;
+ yymsp[-1].minor.yy382 = yylhsminor.yy382;
break;
- case 148: /* as ::= AS ids */
+ case 151: /* as ::= AS ids */
{ yymsp[-1].minor.yy0 = yymsp[0].minor.yy0; }
break;
- case 149: /* as ::= ids */
+ case 152: /* as ::= ids */
{ yylhsminor.yy0 = yymsp[0].minor.yy0; }
yymsp[0].minor.yy0 = yylhsminor.yy0;
break;
- case 150: /* as ::= */
+ case 153: /* as ::= */
{ yymsp[1].minor.yy0.n = 0; }
break;
- case 151: /* from ::= FROM tablelist */
-{yymsp[-1].minor.yy131 = yymsp[0].minor.yy131;}
+ case 154: /* from ::= FROM tablelist */
+{yymsp[-1].minor.yy403 = yymsp[0].minor.yy403;}
break;
- case 152: /* tablelist ::= ids cpxName */
+ case 155: /* tablelist ::= ids cpxName */
{
toTSDBType(yymsp[-1].minor.yy0.type);
yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n;
- yylhsminor.yy131 = tVariantListAppendToken(NULL, &yymsp[-1].minor.yy0, -1);
- yylhsminor.yy131 = tVariantListAppendToken(yylhsminor.yy131, &yymsp[-1].minor.yy0, -1); // table alias name
+ yylhsminor.yy403 = tVariantListAppendToken(NULL, &yymsp[-1].minor.yy0, -1);
+ yylhsminor.yy403 = tVariantListAppendToken(yylhsminor.yy403, &yymsp[-1].minor.yy0, -1); // table alias name
}
- yymsp[-1].minor.yy131 = yylhsminor.yy131;
+ yymsp[-1].minor.yy403 = yylhsminor.yy403;
break;
- case 153: /* tablelist ::= ids cpxName ids */
+ case 156: /* tablelist ::= ids cpxName ids */
{
toTSDBType(yymsp[-2].minor.yy0.type);
toTSDBType(yymsp[0].minor.yy0.type);
yymsp[-2].minor.yy0.n += yymsp[-1].minor.yy0.n;
- yylhsminor.yy131 = tVariantListAppendToken(NULL, &yymsp[-2].minor.yy0, -1);
- yylhsminor.yy131 = tVariantListAppendToken(yylhsminor.yy131, &yymsp[0].minor.yy0, -1);
+ yylhsminor.yy403 = tVariantListAppendToken(NULL, &yymsp[-2].minor.yy0, -1);
+ yylhsminor.yy403 = tVariantListAppendToken(yylhsminor.yy403, &yymsp[0].minor.yy0, -1);
}
- yymsp[-2].minor.yy131 = yylhsminor.yy131;
+ yymsp[-2].minor.yy403 = yylhsminor.yy403;
break;
- case 154: /* tablelist ::= tablelist COMMA ids cpxName */
+ case 157: /* tablelist ::= tablelist COMMA ids cpxName */
{
toTSDBType(yymsp[-1].minor.yy0.type);
yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n;
- yylhsminor.yy131 = tVariantListAppendToken(yymsp[-3].minor.yy131, &yymsp[-1].minor.yy0, -1);
- yylhsminor.yy131 = tVariantListAppendToken(yylhsminor.yy131, &yymsp[-1].minor.yy0, -1);
+ yylhsminor.yy403 = tVariantListAppendToken(yymsp[-3].minor.yy403, &yymsp[-1].minor.yy0, -1);
+ yylhsminor.yy403 = tVariantListAppendToken(yylhsminor.yy403, &yymsp[-1].minor.yy0, -1);
}
- yymsp[-3].minor.yy131 = yylhsminor.yy131;
+ yymsp[-3].minor.yy403 = yylhsminor.yy403;
break;
- case 155: /* tablelist ::= tablelist COMMA ids cpxName ids */
+ case 158: /* tablelist ::= tablelist COMMA ids cpxName ids */
{
toTSDBType(yymsp[-2].minor.yy0.type);
toTSDBType(yymsp[0].minor.yy0.type);
yymsp[-2].minor.yy0.n += yymsp[-1].minor.yy0.n;
- yylhsminor.yy131 = tVariantListAppendToken(yymsp[-4].minor.yy131, &yymsp[-2].minor.yy0, -1);
- yylhsminor.yy131 = tVariantListAppendToken(yylhsminor.yy131, &yymsp[0].minor.yy0, -1);
+ yylhsminor.yy403 = tVariantListAppendToken(yymsp[-4].minor.yy403, &yymsp[-2].minor.yy0, -1);
+ yylhsminor.yy403 = tVariantListAppendToken(yylhsminor.yy403, &yymsp[0].minor.yy0, -1);
}
- yymsp[-4].minor.yy131 = yylhsminor.yy131;
+ yymsp[-4].minor.yy403 = yylhsminor.yy403;
break;
- case 156: /* tmvar ::= VARIABLE */
+ case 159: /* tmvar ::= VARIABLE */
{yylhsminor.yy0 = yymsp[0].minor.yy0;}
yymsp[0].minor.yy0 = yylhsminor.yy0;
break;
- case 157: /* interval_opt ::= INTERVAL LP tmvar RP */
-{yymsp[-3].minor.yy530.interval = yymsp[-1].minor.yy0; yymsp[-3].minor.yy530.offset.n = 0; yymsp[-3].minor.yy530.offset.z = NULL; yymsp[-3].minor.yy530.offset.type = 0;}
+ case 160: /* interval_opt ::= INTERVAL LP tmvar RP */
+{yymsp[-3].minor.yy222.interval = yymsp[-1].minor.yy0; yymsp[-3].minor.yy222.offset.n = 0; yymsp[-3].minor.yy222.offset.z = NULL; yymsp[-3].minor.yy222.offset.type = 0;}
break;
- case 158: /* interval_opt ::= INTERVAL LP tmvar COMMA tmvar RP */
-{yymsp[-5].minor.yy530.interval = yymsp[-3].minor.yy0; yymsp[-5].minor.yy530.offset = yymsp[-1].minor.yy0;}
+ case 161: /* interval_opt ::= INTERVAL LP tmvar COMMA tmvar RP */
+{yymsp[-5].minor.yy222.interval = yymsp[-3].minor.yy0; yymsp[-5].minor.yy222.offset = yymsp[-1].minor.yy0;}
break;
- case 159: /* interval_opt ::= */
-{memset(&yymsp[1].minor.yy530, 0, sizeof(yymsp[1].minor.yy530));}
+ case 162: /* interval_opt ::= */
+{memset(&yymsp[1].minor.yy222, 0, sizeof(yymsp[1].minor.yy222));}
break;
- case 160: /* fill_opt ::= */
-{yymsp[1].minor.yy131 = 0; }
+ case 163: /* fill_opt ::= */
+{yymsp[1].minor.yy403 = 0; }
break;
- case 161: /* fill_opt ::= FILL LP ID COMMA tagitemlist RP */
+ case 164: /* fill_opt ::= FILL LP ID COMMA tagitemlist RP */
{
tVariant A = {0};
toTSDBType(yymsp[-3].minor.yy0.type);
tVariantCreate(&A, &yymsp[-3].minor.yy0);
- tVariantListInsert(yymsp[-1].minor.yy131, &A, -1, 0);
- yymsp[-5].minor.yy131 = yymsp[-1].minor.yy131;
+ tVariantListInsert(yymsp[-1].minor.yy403, &A, -1, 0);
+ yymsp[-5].minor.yy403 = yymsp[-1].minor.yy403;
}
break;
- case 162: /* fill_opt ::= FILL LP ID RP */
+ case 165: /* fill_opt ::= FILL LP ID RP */
{
toTSDBType(yymsp[-1].minor.yy0.type);
- yymsp[-3].minor.yy131 = tVariantListAppendToken(NULL, &yymsp[-1].minor.yy0, -1);
+ yymsp[-3].minor.yy403 = tVariantListAppendToken(NULL, &yymsp[-1].minor.yy0, -1);
}
break;
- case 163: /* sliding_opt ::= SLIDING LP tmvar RP */
+ case 166: /* sliding_opt ::= SLIDING LP tmvar RP */
{yymsp[-3].minor.yy0 = yymsp[-1].minor.yy0; }
break;
- case 164: /* sliding_opt ::= */
+ case 167: /* sliding_opt ::= */
{yymsp[1].minor.yy0.n = 0; yymsp[1].minor.yy0.z = NULL; yymsp[1].minor.yy0.type = 0; }
break;
- case 165: /* orderby_opt ::= */
-{yymsp[1].minor.yy131 = 0;}
+ case 168: /* orderby_opt ::= */
+{yymsp[1].minor.yy403 = 0;}
break;
- case 166: /* orderby_opt ::= ORDER BY sortlist */
-{yymsp[-2].minor.yy131 = yymsp[0].minor.yy131;}
+ case 169: /* orderby_opt ::= ORDER BY sortlist */
+{yymsp[-2].minor.yy403 = yymsp[0].minor.yy403;}
break;
- case 167: /* sortlist ::= sortlist COMMA item sortorder */
+ case 170: /* sortlist ::= sortlist COMMA item sortorder */
{
- yylhsminor.yy131 = tVariantListAppend(yymsp[-3].minor.yy131, &yymsp[-1].minor.yy516, yymsp[0].minor.yy42);
+ yylhsminor.yy403 = tVariantListAppend(yymsp[-3].minor.yy403, &yymsp[-1].minor.yy488, yymsp[0].minor.yy70);
}
- yymsp[-3].minor.yy131 = yylhsminor.yy131;
+ yymsp[-3].minor.yy403 = yylhsminor.yy403;
break;
- case 168: /* sortlist ::= item sortorder */
+ case 171: /* sortlist ::= item sortorder */
{
- yylhsminor.yy131 = tVariantListAppend(NULL, &yymsp[-1].minor.yy516, yymsp[0].minor.yy42);
+ yylhsminor.yy403 = tVariantListAppend(NULL, &yymsp[-1].minor.yy488, yymsp[0].minor.yy70);
}
- yymsp[-1].minor.yy131 = yylhsminor.yy131;
+ yymsp[-1].minor.yy403 = yylhsminor.yy403;
break;
- case 169: /* item ::= ids cpxName */
+ case 172: /* item ::= ids cpxName */
{
toTSDBType(yymsp[-1].minor.yy0.type);
yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n;
- tVariantCreate(&yylhsminor.yy516, &yymsp[-1].minor.yy0);
+ tVariantCreate(&yylhsminor.yy488, &yymsp[-1].minor.yy0);
}
- yymsp[-1].minor.yy516 = yylhsminor.yy516;
+ yymsp[-1].minor.yy488 = yylhsminor.yy488;
break;
- case 170: /* sortorder ::= ASC */
-{ yymsp[0].minor.yy42 = TSDB_ORDER_ASC; }
+ case 173: /* sortorder ::= ASC */
+{ yymsp[0].minor.yy70 = TSDB_ORDER_ASC; }
break;
- case 171: /* sortorder ::= DESC */
-{ yymsp[0].minor.yy42 = TSDB_ORDER_DESC;}
+ case 174: /* sortorder ::= DESC */
+{ yymsp[0].minor.yy70 = TSDB_ORDER_DESC;}
break;
- case 172: /* sortorder ::= */
-{ yymsp[1].minor.yy42 = TSDB_ORDER_ASC; }
+ case 175: /* sortorder ::= */
+{ yymsp[1].minor.yy70 = TSDB_ORDER_ASC; }
break;
- case 173: /* groupby_opt ::= */
-{ yymsp[1].minor.yy131 = 0;}
+ case 176: /* groupby_opt ::= */
+{ yymsp[1].minor.yy403 = 0;}
break;
- case 174: /* groupby_opt ::= GROUP BY grouplist */
-{ yymsp[-2].minor.yy131 = yymsp[0].minor.yy131;}
+ case 177: /* groupby_opt ::= GROUP BY grouplist */
+{ yymsp[-2].minor.yy403 = yymsp[0].minor.yy403;}
break;
- case 175: /* grouplist ::= grouplist COMMA item */
+ case 178: /* grouplist ::= grouplist COMMA item */
{
- yylhsminor.yy131 = tVariantListAppend(yymsp[-2].minor.yy131, &yymsp[0].minor.yy516, -1);
+ yylhsminor.yy403 = tVariantListAppend(yymsp[-2].minor.yy403, &yymsp[0].minor.yy488, -1);
}
- yymsp[-2].minor.yy131 = yylhsminor.yy131;
+ yymsp[-2].minor.yy403 = yylhsminor.yy403;
break;
- case 176: /* grouplist ::= item */
+ case 179: /* grouplist ::= item */
{
- yylhsminor.yy131 = tVariantListAppend(NULL, &yymsp[0].minor.yy516, -1);
+ yylhsminor.yy403 = tVariantListAppend(NULL, &yymsp[0].minor.yy488, -1);
}
- yymsp[0].minor.yy131 = yylhsminor.yy131;
+ yymsp[0].minor.yy403 = yylhsminor.yy403;
break;
- case 177: /* having_opt ::= */
- case 187: /* where_opt ::= */ yytestcase(yyruleno==187);
- case 225: /* expritem ::= */ yytestcase(yyruleno==225);
-{yymsp[1].minor.yy420 = 0;}
+ case 180: /* having_opt ::= */
+ case 190: /* where_opt ::= */ yytestcase(yyruleno==190);
+ case 228: /* expritem ::= */ yytestcase(yyruleno==228);
+{yymsp[1].minor.yy522 = 0;}
break;
- case 178: /* having_opt ::= HAVING expr */
- case 188: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==188);
-{yymsp[-1].minor.yy420 = yymsp[0].minor.yy420;}
+ case 181: /* having_opt ::= HAVING expr */
+ case 191: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==191);
+{yymsp[-1].minor.yy522 = yymsp[0].minor.yy522;}
break;
- case 179: /* limit_opt ::= */
- case 183: /* slimit_opt ::= */ yytestcase(yyruleno==183);
-{yymsp[1].minor.yy284.limit = -1; yymsp[1].minor.yy284.offset = 0;}
+ case 182: /* limit_opt ::= */
+ case 186: /* slimit_opt ::= */ yytestcase(yyruleno==186);
+{yymsp[1].minor.yy404.limit = -1; yymsp[1].minor.yy404.offset = 0;}
break;
- case 180: /* limit_opt ::= LIMIT signed */
- case 184: /* slimit_opt ::= SLIMIT signed */ yytestcase(yyruleno==184);
-{yymsp[-1].minor.yy284.limit = yymsp[0].minor.yy459; yymsp[-1].minor.yy284.offset = 0;}
+ case 183: /* limit_opt ::= LIMIT signed */
+ case 187: /* slimit_opt ::= SLIMIT signed */ yytestcase(yyruleno==187);
+{yymsp[-1].minor.yy404.limit = yymsp[0].minor.yy387; yymsp[-1].minor.yy404.offset = 0;}
break;
- case 181: /* limit_opt ::= LIMIT signed OFFSET signed */
-{ yymsp[-3].minor.yy284.limit = yymsp[-2].minor.yy459; yymsp[-3].minor.yy284.offset = yymsp[0].minor.yy459;}
+ case 184: /* limit_opt ::= LIMIT signed OFFSET signed */
+{ yymsp[-3].minor.yy404.limit = yymsp[-2].minor.yy387; yymsp[-3].minor.yy404.offset = yymsp[0].minor.yy387;}
break;
- case 182: /* limit_opt ::= LIMIT signed COMMA signed */
-{ yymsp[-3].minor.yy284.limit = yymsp[0].minor.yy459; yymsp[-3].minor.yy284.offset = yymsp[-2].minor.yy459;}
+ case 185: /* limit_opt ::= LIMIT signed COMMA signed */
+{ yymsp[-3].minor.yy404.limit = yymsp[0].minor.yy387; yymsp[-3].minor.yy404.offset = yymsp[-2].minor.yy387;}
break;
- case 185: /* slimit_opt ::= SLIMIT signed SOFFSET signed */
-{yymsp[-3].minor.yy284.limit = yymsp[-2].minor.yy459; yymsp[-3].minor.yy284.offset = yymsp[0].minor.yy459;}
+ case 188: /* slimit_opt ::= SLIMIT signed SOFFSET signed */
+{yymsp[-3].minor.yy404.limit = yymsp[-2].minor.yy387; yymsp[-3].minor.yy404.offset = yymsp[0].minor.yy387;}
break;
- case 186: /* slimit_opt ::= SLIMIT signed COMMA signed */
-{yymsp[-3].minor.yy284.limit = yymsp[0].minor.yy459; yymsp[-3].minor.yy284.offset = yymsp[-2].minor.yy459;}
+ case 189: /* slimit_opt ::= SLIMIT signed COMMA signed */
+{yymsp[-3].minor.yy404.limit = yymsp[0].minor.yy387; yymsp[-3].minor.yy404.offset = yymsp[-2].minor.yy387;}
break;
- case 189: /* expr ::= LP expr RP */
-{yylhsminor.yy420 = yymsp[-1].minor.yy420; yylhsminor.yy420->token.z = yymsp[-2].minor.yy0.z; yylhsminor.yy420->token.n = (yymsp[0].minor.yy0.z - yymsp[-2].minor.yy0.z + 1);}
- yymsp[-2].minor.yy420 = yylhsminor.yy420;
+ case 192: /* expr ::= LP expr RP */
+{yylhsminor.yy522 = yymsp[-1].minor.yy522; yylhsminor.yy522->token.z = yymsp[-2].minor.yy0.z; yylhsminor.yy522->token.n = (yymsp[0].minor.yy0.z - yymsp[-2].minor.yy0.z + 1);}
+ yymsp[-2].minor.yy522 = yylhsminor.yy522;
break;
- case 190: /* expr ::= ID */
-{ yylhsminor.yy420 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_ID);}
- yymsp[0].minor.yy420 = yylhsminor.yy420;
+ case 193: /* expr ::= ID */
+{ yylhsminor.yy522 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_ID);}
+ yymsp[0].minor.yy522 = yylhsminor.yy522;
break;
- case 191: /* expr ::= ID DOT ID */
-{ yymsp[-2].minor.yy0.n += (1+yymsp[0].minor.yy0.n); yylhsminor.yy420 = tSqlExprIdValueCreate(&yymsp[-2].minor.yy0, TK_ID);}
- yymsp[-2].minor.yy420 = yylhsminor.yy420;
+ case 194: /* expr ::= ID DOT ID */
+{ yymsp[-2].minor.yy0.n += (1+yymsp[0].minor.yy0.n); yylhsminor.yy522 = tSqlExprIdValueCreate(&yymsp[-2].minor.yy0, TK_ID);}
+ yymsp[-2].minor.yy522 = yylhsminor.yy522;
break;
- case 192: /* expr ::= ID DOT STAR */
-{ yymsp[-2].minor.yy0.n += (1+yymsp[0].minor.yy0.n); yylhsminor.yy420 = tSqlExprIdValueCreate(&yymsp[-2].minor.yy0, TK_ALL);}
- yymsp[-2].minor.yy420 = yylhsminor.yy420;
+ case 195: /* expr ::= ID DOT STAR */
+{ yymsp[-2].minor.yy0.n += (1+yymsp[0].minor.yy0.n); yylhsminor.yy522 = tSqlExprIdValueCreate(&yymsp[-2].minor.yy0, TK_ALL);}
+ yymsp[-2].minor.yy522 = yylhsminor.yy522;
break;
- case 193: /* expr ::= INTEGER */
-{ yylhsminor.yy420 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_INTEGER);}
- yymsp[0].minor.yy420 = yylhsminor.yy420;
+ case 196: /* expr ::= INTEGER */
+{ yylhsminor.yy522 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_INTEGER);}
+ yymsp[0].minor.yy522 = yylhsminor.yy522;
break;
- case 194: /* expr ::= MINUS INTEGER */
- case 195: /* expr ::= PLUS INTEGER */ yytestcase(yyruleno==195);
-{ yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n; yymsp[-1].minor.yy0.type = TK_INTEGER; yylhsminor.yy420 = tSqlExprIdValueCreate(&yymsp[-1].minor.yy0, TK_INTEGER);}
- yymsp[-1].minor.yy420 = yylhsminor.yy420;
+ case 197: /* expr ::= MINUS INTEGER */
+ case 198: /* expr ::= PLUS INTEGER */ yytestcase(yyruleno==198);
+{ yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n; yymsp[-1].minor.yy0.type = TK_INTEGER; yylhsminor.yy522 = tSqlExprIdValueCreate(&yymsp[-1].minor.yy0, TK_INTEGER);}
+ yymsp[-1].minor.yy522 = yylhsminor.yy522;
break;
- case 196: /* expr ::= FLOAT */
-{ yylhsminor.yy420 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_FLOAT);}
- yymsp[0].minor.yy420 = yylhsminor.yy420;
+ case 199: /* expr ::= FLOAT */
+{ yylhsminor.yy522 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_FLOAT);}
+ yymsp[0].minor.yy522 = yylhsminor.yy522;
break;
- case 197: /* expr ::= MINUS FLOAT */
- case 198: /* expr ::= PLUS FLOAT */ yytestcase(yyruleno==198);
-{ yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n; yymsp[-1].minor.yy0.type = TK_FLOAT; yylhsminor.yy420 = tSqlExprIdValueCreate(&yymsp[-1].minor.yy0, TK_FLOAT);}
- yymsp[-1].minor.yy420 = yylhsminor.yy420;
+ case 200: /* expr ::= MINUS FLOAT */
+ case 201: /* expr ::= PLUS FLOAT */ yytestcase(yyruleno==201);
+{ yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n; yymsp[-1].minor.yy0.type = TK_FLOAT; yylhsminor.yy522 = tSqlExprIdValueCreate(&yymsp[-1].minor.yy0, TK_FLOAT);}
+ yymsp[-1].minor.yy522 = yylhsminor.yy522;
break;
- case 199: /* expr ::= STRING */
-{ yylhsminor.yy420 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_STRING);}
- yymsp[0].minor.yy420 = yylhsminor.yy420;
+ case 202: /* expr ::= STRING */
+{ yylhsminor.yy522 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_STRING);}
+ yymsp[0].minor.yy522 = yylhsminor.yy522;
break;
- case 200: /* expr ::= NOW */
-{ yylhsminor.yy420 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_NOW); }
- yymsp[0].minor.yy420 = yylhsminor.yy420;
+ case 203: /* expr ::= NOW */
+{ yylhsminor.yy522 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_NOW); }
+ yymsp[0].minor.yy522 = yylhsminor.yy522;
break;
- case 201: /* expr ::= VARIABLE */
-{ yylhsminor.yy420 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_VARIABLE);}
- yymsp[0].minor.yy420 = yylhsminor.yy420;
+ case 204: /* expr ::= VARIABLE */
+{ yylhsminor.yy522 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_VARIABLE);}
+ yymsp[0].minor.yy522 = yylhsminor.yy522;
break;
- case 202: /* expr ::= BOOL */
-{ yylhsminor.yy420 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_BOOL);}
- yymsp[0].minor.yy420 = yylhsminor.yy420;
+ case 205: /* expr ::= BOOL */
+{ yylhsminor.yy522 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_BOOL);}
+ yymsp[0].minor.yy522 = yylhsminor.yy522;
break;
- case 203: /* expr ::= ID LP exprlist RP */
-{ yylhsminor.yy420 = tSqlExprCreateFunction(yymsp[-1].minor.yy478, &yymsp[-3].minor.yy0, &yymsp[0].minor.yy0,
- yymsp[-3].minor.yy0.type); }
- yymsp[-3].minor.yy420 = yylhsminor.yy420;
+ case 206: /* expr ::= ID LP exprlist RP */
+{ yylhsminor.yy522 = tSqlExprCreateFunction(yymsp[-1].minor.yy382, &yymsp[-3].minor.yy0, &yymsp[0].minor.yy0, yymsp[-3].minor.yy0.type); }
+ yymsp[-3].minor.yy522 = yylhsminor.yy522;
break;
- case 204: /* expr ::= ID LP STAR RP */
-{ yylhsminor.yy420 =
- tSqlExprCreateFunction(NULL, &yymsp[-3].minor.yy0, &yymsp[0].minor.yy0, yymsp[-3].minor.yy0.type); }
- yymsp[-3].minor.yy420 = yylhsminor.yy420;
+ case 207: /* expr ::= ID LP STAR RP */
+{ yylhsminor.yy522 = tSqlExprCreateFunction(NULL, &yymsp[-3].minor.yy0, &yymsp[0].minor.yy0, yymsp[-3].minor.yy0.type); }
+ yymsp[-3].minor.yy522 = yylhsminor.yy522;
break;
- case 205: /* expr ::= expr IS NULL */
-{yylhsminor.yy420 = tSqlExprCreate(yymsp[-2].minor.yy420, NULL, TK_ISNULL);}
- yymsp[-2].minor.yy420 = yylhsminor.yy420;
+ case 208: /* expr ::= expr IS NULL */
+{yylhsminor.yy522 = tSqlExprCreate(yymsp[-2].minor.yy522, NULL, TK_ISNULL);}
+ yymsp[-2].minor.yy522 = yylhsminor.yy522;
break;
- case 206: /* expr ::= expr IS NOT NULL */
-{yylhsminor.yy420 = tSqlExprCreate(yymsp[-3].minor.yy420, NULL, TK_NOTNULL);}
- yymsp[-3].minor.yy420 = yylhsminor.yy420;
+ case 209: /* expr ::= expr IS NOT NULL */
+{yylhsminor.yy522 = tSqlExprCreate(yymsp[-3].minor.yy522, NULL, TK_NOTNULL);}
+ yymsp[-3].minor.yy522 = yylhsminor.yy522;
break;
- case 207: /* expr ::= expr LT expr */
-{yylhsminor.yy420 = tSqlExprCreate(yymsp[-2].minor.yy420, yymsp[0].minor.yy420, TK_LT);}
- yymsp[-2].minor.yy420 = yylhsminor.yy420;
+ case 210: /* expr ::= expr LT expr */
+{yylhsminor.yy522 = tSqlExprCreate(yymsp[-2].minor.yy522, yymsp[0].minor.yy522, TK_LT);}
+ yymsp[-2].minor.yy522 = yylhsminor.yy522;
break;
- case 208: /* expr ::= expr GT expr */
-{yylhsminor.yy420 = tSqlExprCreate(yymsp[-2].minor.yy420, yymsp[0].minor.yy420, TK_GT);}
- yymsp[-2].minor.yy420 = yylhsminor.yy420;
+ case 211: /* expr ::= expr GT expr */
+{yylhsminor.yy522 = tSqlExprCreate(yymsp[-2].minor.yy522, yymsp[0].minor.yy522, TK_GT);}
+ yymsp[-2].minor.yy522 = yylhsminor.yy522;
break;
- case 209: /* expr ::= expr LE expr */
-{yylhsminor.yy420 = tSqlExprCreate(yymsp[-2].minor.yy420, yymsp[0].minor.yy420, TK_LE);}
- yymsp[-2].minor.yy420 = yylhsminor.yy420;
+ case 212: /* expr ::= expr LE expr */
+{yylhsminor.yy522 = tSqlExprCreate(yymsp[-2].minor.yy522, yymsp[0].minor.yy522, TK_LE);}
+ yymsp[-2].minor.yy522 = yylhsminor.yy522;
break;
- case 210: /* expr ::= expr GE expr */
-{yylhsminor.yy420 = tSqlExprCreate(yymsp[-2].minor.yy420, yymsp[0].minor.yy420, TK_GE);}
- yymsp[-2].minor.yy420 = yylhsminor.yy420;
+ case 213: /* expr ::= expr GE expr */
+{yylhsminor.yy522 = tSqlExprCreate(yymsp[-2].minor.yy522, yymsp[0].minor.yy522, TK_GE);}
+ yymsp[-2].minor.yy522 = yylhsminor.yy522;
break;
- case 211: /* expr ::= expr NE expr */
-{yylhsminor.yy420 = tSqlExprCreate(yymsp[-2].minor.yy420, yymsp[0].minor.yy420, TK_NE);}
- yymsp[-2].minor.yy420 = yylhsminor.yy420;
+ case 214: /* expr ::= expr NE expr */
+{yylhsminor.yy522 = tSqlExprCreate(yymsp[-2].minor.yy522, yymsp[0].minor.yy522, TK_NE);}
+ yymsp[-2].minor.yy522 = yylhsminor.yy522;
break;
- case 212: /* expr ::= expr EQ expr */
-{yylhsminor.yy420 = tSqlExprCreate(yymsp[-2].minor.yy420, yymsp[0].minor.yy420, TK_EQ);}
- yymsp[-2].minor.yy420 = yylhsminor.yy420;
+ case 215: /* expr ::= expr EQ expr */
+{yylhsminor.yy522 = tSqlExprCreate(yymsp[-2].minor.yy522, yymsp[0].minor.yy522, TK_EQ);}
+ yymsp[-2].minor.yy522 = yylhsminor.yy522;
break;
- case 213: /* expr ::= expr AND expr */
-{yylhsminor.yy420 = tSqlExprCreate(yymsp[-2].minor.yy420, yymsp[0].minor.yy420, TK_AND);}
- yymsp[-2].minor.yy420 = yylhsminor.yy420;
+ case 216: /* expr ::= expr AND expr */
+{yylhsminor.yy522 = tSqlExprCreate(yymsp[-2].minor.yy522, yymsp[0].minor.yy522, TK_AND);}
+ yymsp[-2].minor.yy522 = yylhsminor.yy522;
break;
- case 214: /* expr ::= expr OR expr */
-{yylhsminor.yy420 = tSqlExprCreate(yymsp[-2].minor.yy420, yymsp[0].minor.yy420, TK_OR); }
- yymsp[-2].minor.yy420 = yylhsminor.yy420;
+ case 217: /* expr ::= expr OR expr */
+{yylhsminor.yy522 = tSqlExprCreate(yymsp[-2].minor.yy522, yymsp[0].minor.yy522, TK_OR); }
+ yymsp[-2].minor.yy522 = yylhsminor.yy522;
break;
- case 215: /* expr ::= expr PLUS expr */
-{yylhsminor.yy420 = tSqlExprCreate(yymsp[-2].minor.yy420, yymsp[0].minor.yy420, TK_PLUS); }
- yymsp[-2].minor.yy420 = yylhsminor.yy420;
+ case 218: /* expr ::= expr PLUS expr */
+{yylhsminor.yy522 = tSqlExprCreate(yymsp[-2].minor.yy522, yymsp[0].minor.yy522, TK_PLUS); }
+ yymsp[-2].minor.yy522 = yylhsminor.yy522;
break;
- case 216: /* expr ::= expr MINUS expr */
-{yylhsminor.yy420 = tSqlExprCreate(yymsp[-2].minor.yy420, yymsp[0].minor.yy420, TK_MINUS); }
- yymsp[-2].minor.yy420 = yylhsminor.yy420;
+ case 219: /* expr ::= expr MINUS expr */
+{yylhsminor.yy522 = tSqlExprCreate(yymsp[-2].minor.yy522, yymsp[0].minor.yy522, TK_MINUS); }
+ yymsp[-2].minor.yy522 = yylhsminor.yy522;
break;
- case 217: /* expr ::= expr STAR expr */
-{yylhsminor.yy420 = tSqlExprCreate(yymsp[-2].minor.yy420, yymsp[0].minor.yy420, TK_STAR); }
- yymsp[-2].minor.yy420 = yylhsminor.yy420;
+ case 220: /* expr ::= expr STAR expr */
+{yylhsminor.yy522 = tSqlExprCreate(yymsp[-2].minor.yy522, yymsp[0].minor.yy522, TK_STAR); }
+ yymsp[-2].minor.yy522 = yylhsminor.yy522;
break;
- case 218: /* expr ::= expr SLASH expr */
-{yylhsminor.yy420 = tSqlExprCreate(yymsp[-2].minor.yy420, yymsp[0].minor.yy420, TK_DIVIDE);}
- yymsp[-2].minor.yy420 = yylhsminor.yy420;
+ case 221: /* expr ::= expr SLASH expr */
+{yylhsminor.yy522 = tSqlExprCreate(yymsp[-2].minor.yy522, yymsp[0].minor.yy522, TK_DIVIDE);}
+ yymsp[-2].minor.yy522 = yylhsminor.yy522;
break;
- case 219: /* expr ::= expr REM expr */
-{yylhsminor.yy420 = tSqlExprCreate(yymsp[-2].minor.yy420, yymsp[0].minor.yy420, TK_REM); }
- yymsp[-2].minor.yy420 = yylhsminor.yy420;
+ case 222: /* expr ::= expr REM expr */
+{yylhsminor.yy522 = tSqlExprCreate(yymsp[-2].minor.yy522, yymsp[0].minor.yy522, TK_REM); }
+ yymsp[-2].minor.yy522 = yylhsminor.yy522;
break;
- case 220: /* expr ::= expr LIKE expr */
-{yylhsminor.yy420 = tSqlExprCreate(yymsp[-2].minor.yy420, yymsp[0].minor.yy420, TK_LIKE); }
- yymsp[-2].minor.yy420 = yylhsminor.yy420;
+ case 223: /* expr ::= expr LIKE expr */
+{yylhsminor.yy522 = tSqlExprCreate(yymsp[-2].minor.yy522, yymsp[0].minor.yy522, TK_LIKE); }
+ yymsp[-2].minor.yy522 = yylhsminor.yy522;
break;
- case 221: /* expr ::= expr IN LP exprlist RP */
-{yylhsminor.yy420 = tSqlExprCreate(yymsp[-4].minor.yy420, (tSQLExpr *)yymsp[-1].minor.yy478, TK_IN); }
- yymsp[-4].minor.yy420 = yylhsminor.yy420;
+ case 224: /* expr ::= expr IN LP exprlist RP */
+{yylhsminor.yy522 = tSqlExprCreate(yymsp[-4].minor.yy522, (tSQLExpr*)yymsp[-1].minor.yy382, TK_IN); }
+ yymsp[-4].minor.yy522 = yylhsminor.yy522;
break;
- case 222: /* exprlist ::= exprlist COMMA expritem */
-{yylhsminor.yy478 = tSqlExprListAppend(yymsp[-2].minor.yy478, yymsp[0].minor.yy420, 0);}
- yymsp[-2].minor.yy478 = yylhsminor.yy478;
+ case 225: /* exprlist ::= exprlist COMMA expritem */
+{yylhsminor.yy382 = tSqlExprListAppend(yymsp[-2].minor.yy382,yymsp[0].minor.yy522,0);}
+ yymsp[-2].minor.yy382 = yylhsminor.yy382;
break;
- case 223: /* exprlist ::= expritem */
-{yylhsminor.yy478 = tSqlExprListAppend(0, yymsp[0].minor.yy420, 0);}
- yymsp[0].minor.yy478 = yylhsminor.yy478;
+ case 226: /* exprlist ::= expritem */
+{yylhsminor.yy382 = tSqlExprListAppend(0,yymsp[0].minor.yy522,0);}
+ yymsp[0].minor.yy382 = yylhsminor.yy382;
break;
- case 224: /* expritem ::= expr */
-{yylhsminor.yy420 = yymsp[0].minor.yy420;}
- yymsp[0].minor.yy420 = yylhsminor.yy420;
+ case 227: /* expritem ::= expr */
+{yylhsminor.yy522 = yymsp[0].minor.yy522;}
+ yymsp[0].minor.yy522 = yylhsminor.yy522;
break;
- case 226: /* cmd ::= RESET QUERY CACHE */
+ case 229: /* cmd ::= RESET QUERY CACHE */
{ setDCLSQLElems(pInfo, TSDB_SQL_RESET_CACHE, 0);}
break;
- case 227: /* cmd ::= ALTER TABLE ids cpxName ADD COLUMN columnlist */
+ case 230: /* cmd ::= ALTER TABLE ids cpxName ADD COLUMN columnlist */
{
yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n;
- SAlterTableSQL* pAlterTable =
- tAlterTableSqlElems(&yymsp[-4].minor.yy0, yymsp[0].minor.yy131, NULL, TSDB_ALTER_TABLE_ADD_COLUMN);
+ SAlterTableSQL* pAlterTable = tAlterTableSqlElems(&yymsp[-4].minor.yy0, yymsp[0].minor.yy403, NULL, TSDB_ALTER_TABLE_ADD_COLUMN);
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
}
break;
- case 228: /* cmd ::= ALTER TABLE ids cpxName DROP COLUMN ids */
+ case 231: /* cmd ::= ALTER TABLE ids cpxName DROP COLUMN ids */
{
yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n;
@@ -2868,15 +2868,14 @@ static void yy_reduce(
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
}
break;
- case 229: /* cmd ::= ALTER TABLE ids cpxName ADD TAG columnlist */
+ case 232: /* cmd ::= ALTER TABLE ids cpxName ADD TAG columnlist */
{
yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n;
- SAlterTableSQL* pAlterTable =
- tAlterTableSqlElems(&yymsp[-4].minor.yy0, yymsp[0].minor.yy131, NULL, TSDB_ALTER_TABLE_ADD_TAG_COLUMN);
+ SAlterTableSQL* pAlterTable = tAlterTableSqlElems(&yymsp[-4].minor.yy0, yymsp[0].minor.yy403, NULL, TSDB_ALTER_TABLE_ADD_TAG_COLUMN);
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
}
break;
- case 230: /* cmd ::= ALTER TABLE ids cpxName DROP TAG ids */
+ case 233: /* cmd ::= ALTER TABLE ids cpxName DROP TAG ids */
{
yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n;
@@ -2887,7 +2886,7 @@ static void yy_reduce(
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
}
break;
- case 231: /* cmd ::= ALTER TABLE ids cpxName CHANGE TAG ids ids */
+ case 234: /* cmd ::= ALTER TABLE ids cpxName CHANGE TAG ids ids */
{
yymsp[-5].minor.yy0.n += yymsp[-4].minor.yy0.n;
@@ -2897,34 +2896,30 @@ static void yy_reduce(
toTSDBType(yymsp[0].minor.yy0.type);
A = tVariantListAppendToken(A, &yymsp[0].minor.yy0, -1);
- SAlterTableSQL* pAlterTable =
- tAlterTableSqlElems(&yymsp[-5].minor.yy0, NULL, A, TSDB_ALTER_TABLE_CHANGE_TAG_COLUMN);
+ SAlterTableSQL* pAlterTable = tAlterTableSqlElems(&yymsp[-5].minor.yy0, NULL, A, TSDB_ALTER_TABLE_CHANGE_TAG_COLUMN);
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
}
break;
- case 232: /* cmd ::= ALTER TABLE ids cpxName SET TAG ids EQ tagitem */
+ case 235: /* cmd ::= ALTER TABLE ids cpxName SET TAG ids EQ tagitem */
{
yymsp[-6].minor.yy0.n += yymsp[-5].minor.yy0.n;
toTSDBType(yymsp[-2].minor.yy0.type);
SArray* A = tVariantListAppendToken(NULL, &yymsp[-2].minor.yy0, -1);
- A = tVariantListAppend(A, &yymsp[0].minor.yy516, -1);
+ A = tVariantListAppend(A, &yymsp[0].minor.yy488, -1);
SAlterTableSQL* pAlterTable = tAlterTableSqlElems(&yymsp[-6].minor.yy0, NULL, A, TSDB_ALTER_TABLE_UPDATE_TAG_VAL);
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
}
break;
- case 233: /* cmd ::= KILL CONNECTION INTEGER */
-{
- setKillSql(pInfo, TSDB_SQL_KILL_CONNECTION, &yymsp[0].minor.yy0);}
+ case 236: /* cmd ::= KILL CONNECTION INTEGER */
+{setKillSql(pInfo, TSDB_SQL_KILL_CONNECTION, &yymsp[0].minor.yy0);}
break;
- case 234: /* cmd ::= KILL STREAM INTEGER COLON INTEGER */
-{yymsp[-2].minor.yy0.n += (yymsp[-1].minor.yy0.n + yymsp[0].minor.yy0.n);
- setKillSql(pInfo, TSDB_SQL_KILL_STREAM, &yymsp[-2].minor.yy0);}
+ case 237: /* cmd ::= KILL STREAM INTEGER COLON INTEGER */
+{yymsp[-2].minor.yy0.n += (yymsp[-1].minor.yy0.n + yymsp[0].minor.yy0.n); setKillSql(pInfo, TSDB_SQL_KILL_STREAM, &yymsp[-2].minor.yy0);}
break;
- case 235: /* cmd ::= KILL QUERY INTEGER COLON INTEGER */
-{yymsp[-2].minor.yy0.n += (yymsp[-1].minor.yy0.n + yymsp[0].minor.yy0.n);
- setKillSql(pInfo, TSDB_SQL_KILL_QUERY, &yymsp[-2].minor.yy0);}
+ case 238: /* cmd ::= KILL QUERY INTEGER COLON INTEGER */
+{yymsp[-2].minor.yy0.n += (yymsp[-1].minor.yy0.n + yymsp[0].minor.yy0.n); setKillSql(pInfo, TSDB_SQL_KILL_QUERY, &yymsp[-2].minor.yy0);}
break;
default:
break;
diff --git a/src/query/tests/histogramTest.cpp b/src/query/tests/histogramTest.cpp
index 4a5f7fbbbe..82fd4bcf99 100644
--- a/src/query/tests/histogramTest.cpp
+++ b/src/query/tests/histogramTest.cpp
@@ -21,19 +21,19 @@ TEST(testCase, histogram_binary_search) {
pHisto->elems[i].val = i;
}
- int32_t idx = vnodeHistobinarySearch(pHisto->elems, pHisto->numOfEntries, 1);
+ int32_t idx = histoBinarySearch(pHisto->elems, pHisto->numOfEntries, 1);
assert(idx == 1);
- idx = vnodeHistobinarySearch(pHisto->elems, pHisto->numOfEntries, 9);
+ idx = histoBinarySearch(pHisto->elems, pHisto->numOfEntries, 9);
assert(idx == 9);
- idx = vnodeHistobinarySearch(pHisto->elems, pHisto->numOfEntries, 20);
+ idx = histoBinarySearch(pHisto->elems, pHisto->numOfEntries, 20);
assert(idx == 10);
- idx = vnodeHistobinarySearch(pHisto->elems, pHisto->numOfEntries, -1);
+ idx = histoBinarySearch(pHisto->elems, pHisto->numOfEntries, -1);
assert(idx == 0);
- idx = vnodeHistobinarySearch(pHisto->elems, pHisto->numOfEntries, 3.9);
+ idx = histoBinarySearch(pHisto->elems, pHisto->numOfEntries, 3.9);
assert(idx == 4);
free(pHisto);
diff --git a/src/rpc/inc/rpcHead.h b/src/rpc/inc/rpcHead.h
index 520edadc7d..5b401ac54b 100644
--- a/src/rpc/inc/rpcHead.h
+++ b/src/rpc/inc/rpcHead.h
@@ -20,10 +20,6 @@
extern "C" {
#endif
-#define RPC_CONN_UDPS 0
-#define RPC_CONN_UDPC 1
-#define RPC_CONN_TCPS 2
-#define RPC_CONN_TCPC 3
#define RPC_CONN_TCP 2
extern int tsRpcOverhead;
@@ -58,6 +54,7 @@ typedef struct {
char empty[1]; // reserved
uint8_t msgType; // message type
int32_t msgLen; // message length including the header iteslf
+ uint32_t msgVer;
int32_t code; // code in response message
uint8_t content[0]; // message body starts from here
} SRpcHead;
diff --git a/src/rpc/inc/rpcLog.h b/src/rpc/inc/rpcLog.h
index 3c1614cda2..6c4a281d2c 100644
--- a/src/rpc/inc/rpcLog.h
+++ b/src/rpc/inc/rpcLog.h
@@ -23,7 +23,7 @@ extern "C" {
#include "tlog.h"
extern int32_t rpcDebugFlag;
-extern uint32_t tscEmbedded;
+extern int8_t tscEmbedded;
#define tFatal(...) { if (rpcDebugFlag & DEBUG_FATAL) { taosPrintLog("RPC FATAL ", tscEmbedded ? 255 : rpcDebugFlag, __VA_ARGS__); }}
#define tError(...) { if (rpcDebugFlag & DEBUG_ERROR) { taosPrintLog("RPC ERROR ", tscEmbedded ? 255 : rpcDebugFlag, __VA_ARGS__); }}
diff --git a/src/rpc/src/rpcMain.c b/src/rpc/src/rpcMain.c
index 1d394d8795..fbc59d8ddf 100644
--- a/src/rpc/src/rpcMain.c
+++ b/src/rpc/src/rpcMain.c
@@ -142,7 +142,6 @@ static int32_t tsRpcNum = 0;
#define RPC_CONN_UDPC 1
#define RPC_CONN_TCPS 2
#define RPC_CONN_TCPC 3
-#define RPC_CONN_TCP 2
void *(*taosInitConn[])(uint32_t ip, uint16_t port, char *label, int threads, void *fp, void *shandle) = {
taosInitUdpConnection,
@@ -959,6 +958,11 @@ static SRpcConn *rpcProcessMsgHead(SRpcInfo *pRpc, SRecvInfo *pRecv, SRpcReqCont
terrno = TSDB_CODE_RPC_INVALID_SESSION_ID; return NULL;
}
+ if (rpcIsReq(pHead->msgType) && htonl(pHead->msgVer) != tsVersion >> 8) {
+ tDebug("%s sid:%d, invalid client version:%x/%x %s", pRpc->label, sid, htonl(pHead->msgVer), tsVersion, taosMsg[pHead->msgType]);
+ terrno = TSDB_CODE_RPC_INVALID_VERSION; return NULL;
+ }
+
pConn = rpcGetConnObj(pRpc, sid, pRecv);
if (pConn == NULL) {
tDebug("%s %p, failed to get connection obj(%s)", pRpc->label, (void *)pHead->ahandle, tstrerror(terrno));
@@ -1212,6 +1216,7 @@ static void rpcSendReqHead(SRpcConn *pConn) {
pHead = (SRpcHead *)msg;
pHead->version = 1;
pHead->msgType = pConn->outType;
+ pHead->msgVer = htonl(tsVersion >> 8);
pHead->spi = pConn->spi;
pHead->encrypt = 0;
pHead->tranId = pConn->outTranId;
@@ -1282,6 +1287,7 @@ static void rpcSendReqToServer(SRpcInfo *pRpc, SRpcReqContext *pContext) {
// set the message header
pHead->version = 1;
+ pHead->msgVer = htonl(tsVersion >> 8);
pHead->msgType = msgType;
pHead->encrypt = 0;
pConn->tranId++;
diff --git a/src/sync/inc/syncInt.h b/src/sync/inc/syncInt.h
index d855c651f9..47090cfa0c 100644
--- a/src/sync/inc/syncInt.h
+++ b/src/sync/inc/syncInt.h
@@ -38,7 +38,7 @@ extern "C" {
#define SYNC_MAX_FWDS 512
#define SYNC_FWD_TIMER 300
#define SYNC_ROLE_TIMER 15000 // ms
-#define SYNC_CHECK_INTERVAL 1 // ms
+#define SYNC_CHECK_INTERVAL 1000 // ms
#define SYNC_WAIT_AFTER_CHOOSE_MASTER 10 // ms
#define nodeRole pNode->peerInfo[pNode->selfIndex]->role
@@ -86,9 +86,10 @@ typedef struct SsyncPeer {
int32_t peerFd; // forward FD
int32_t numOfRetrieves; // number of retrieves tried
int32_t fileChanged; // a flag to indicate file is changed during retrieving process
+ int32_t refCount;
+ int64_t rid;
void * timer;
void * pConn;
- int32_t refCount; // reference count
struct SSyncNode *pSyncNode;
} SSyncPeer;
@@ -98,6 +99,7 @@ typedef struct SSyncNode {
int8_t quorum;
int8_t selfIndex;
uint32_t vgId;
+ int32_t refCount;
int64_t rid;
SSyncPeer * peerInfo[TAOS_SYNC_MAX_REPLICA + 1]; // extra one for arbitrator
SSyncPeer * pMaster;
@@ -121,13 +123,13 @@ extern int32_t tsSyncNum;
extern char tsNodeFqdn[TSDB_FQDN_LEN];
extern char * syncStatus[];
-void *syncRetrieveData(void *param);
-void *syncRestoreData(void *param);
-int32_t syncSaveIntoBuffer(SSyncPeer *pPeer, SWalHead *pHead);
-void syncRestartConnection(SSyncPeer *pPeer);
-void syncBroadcastStatus(SSyncNode *pNode);
-void syncAddPeerRef(SSyncPeer *pPeer);
-int32_t syncDecPeerRef(SSyncPeer *pPeer);
+void * syncRetrieveData(void *param);
+void * syncRestoreData(void *param);
+int32_t syncSaveIntoBuffer(SSyncPeer *pPeer, SWalHead *pHead);
+void syncRestartConnection(SSyncPeer *pPeer);
+void syncBroadcastStatus(SSyncNode *pNode);
+SSyncPeer *syncAcquirePeer(int64_t rid);
+void syncReleasePeer(SSyncPeer *pPeer);
#ifdef __cplusplus
}
diff --git a/src/sync/inc/syncTcp.h b/src/sync/inc/syncTcp.h
index 7db51f2a71..d4674fee6b 100644
--- a/src/sync/inc/syncTcp.h
+++ b/src/sync/inc/syncTcp.h
@@ -25,14 +25,14 @@ typedef struct {
uint32_t serverIp;
int16_t port;
int32_t bufferSize;
- void (*processBrokenLink)(void *ahandle);
- int32_t (*processIncomingMsg)(void *ahandle, void *buffer);
+ void (*processBrokenLink)(int64_t handleId);
+ int32_t (*processIncomingMsg)(int64_t handleId, void *buffer);
void (*processIncomingConn)(int32_t fd, uint32_t ip);
} SPoolInfo;
void *syncOpenTcpThreadPool(SPoolInfo *pInfo);
void syncCloseTcpThreadPool(void *);
-void *syncAllocateTcpConn(void *, void *ahandle, int32_t connFd);
+void *syncAllocateTcpConn(void *, int64_t rid, int32_t connFd);
void syncFreeTcpConn(void *);
#ifdef __cplusplus
diff --git a/src/sync/src/syncArbitrator.c b/src/sync/src/syncArbitrator.c
index 1cb2b8f302..fed0774346 100644
--- a/src/sync/src/syncArbitrator.c
+++ b/src/sync/src/syncArbitrator.c
@@ -29,8 +29,8 @@
static void arbSignalHandler(int32_t signum, siginfo_t *sigInfo, void *context);
static void arbProcessIncommingConnection(int32_t connFd, uint32_t sourceIp);
-static void arbProcessBrokenLink(void *param);
-static int32_t arbProcessPeerMsg(void *param, void *buffer);
+static void arbProcessBrokenLink(int64_t rid);
+static int32_t arbProcessPeerMsg(int64_t rid, void *buffer);
static tsem_t tsArbSem;
static void * tsArbTcpPool;
@@ -138,20 +138,20 @@ static void arbProcessIncommingConnection(int32_t connFd, uint32_t sourceIp) {
sDebug("%s, arbitrator request is accepted", pNode->id);
pNode->nodeFd = connFd;
- pNode->pConn = syncAllocateTcpConn(tsArbTcpPool, pNode, connFd);
+ pNode->pConn = syncAllocateTcpConn(tsArbTcpPool, (int64_t)pNode, connFd);
return;
}
-static void arbProcessBrokenLink(void *param) {
- SNodeConn *pNode = param;
+static void arbProcessBrokenLink(int64_t rid) {
+ SNodeConn *pNode = (SNodeConn *)rid;
sDebug("%s, TCP link is broken since %s, close connection", pNode->id, strerror(errno));
tfree(pNode);
}
-static int32_t arbProcessPeerMsg(void *param, void *buffer) {
- SNodeConn *pNode = param;
+static int32_t arbProcessPeerMsg(int64_t rid, void *buffer) {
+ SNodeConn *pNode = (SNodeConn *)rid;
SSyncHead head;
int32_t bytes = 0;
char * cont = (char *)buffer;
diff --git a/src/sync/src/syncMain.c b/src/sync/src/syncMain.c
index bd9df64b7f..380e44780f 100644
--- a/src/sync/src/syncMain.c
+++ b/src/sync/src/syncMain.c
@@ -35,19 +35,21 @@ char tsNodeFqdn[TSDB_FQDN_LEN] = {0};
static void * tsTcpPool = NULL;
static void * tsSyncTmrCtrl = NULL;
static void * tsVgIdHash = NULL;
-static int32_t tsSyncRefId = -1;
+static int32_t tsNodeRefId = -1;
+static int32_t tsPeerRefId = -1;
// local functions
static void syncProcessSyncRequest(char *pMsg, SSyncPeer *pPeer);
static void syncRecoverFromMaster(SSyncPeer *pPeer);
static void syncCheckPeerConnection(void *param, void *tmrId);
-static void syncSendPeersStatusMsgToPeer(SSyncPeer *pPeer, char ack, int8_t type, uint16_t tranId);
-static void syncProcessBrokenLink(void *param);
-static int32_t syncProcessPeerMsg(void *param, void *buffer);
+static int32_t syncSendPeersStatusMsgToPeer(SSyncPeer *pPeer, char ack, int8_t type, uint16_t tranId);
+static void syncProcessBrokenLink(int64_t rid);
+static int32_t syncProcessPeerMsg(int64_t rid, void *buffer);
static void syncProcessIncommingConnection(int32_t connFd, uint32_t sourceIp);
static void syncRemovePeer(SSyncPeer *pPeer);
static void syncAddArbitrator(SSyncNode *pNode);
static void syncFreeNode(void *);
+static void syncFreePeer(void *);
static void syncRemoveConfirmedFwdInfo(SSyncNode *pNode);
static void syncMonitorFwdInfos(void *param, void *tmrId);
static void syncMonitorNodeRole(void *param, void *tmrId);
@@ -55,7 +57,12 @@ static void syncProcessFwdAck(SSyncNode *pNode, SFwdInfo *pFwdInfo, int32_t c
static int32_t syncSaveFwdInfo(SSyncNode *pNode, uint64_t version, void *mhandle);
static void syncRestartPeer(SSyncPeer *pPeer);
static int32_t syncForwardToPeerImpl(SSyncNode *pNode, void *data, void *mhandle, int32_t qtyp);
+
static SSyncPeer *syncAddPeer(SSyncNode *pNode, const SNodeInfo *pInfo);
+static void syncStartCheckPeerConn(SSyncPeer *pPeer);
+static void syncStopCheckPeerConn(SSyncPeer *pPeer);
+static SSyncNode *syncAcquireNode(int64_t rid);
+static void syncReleaseNode(SSyncNode *pNode);
char* syncRole[] = {
"offline",
@@ -87,29 +94,34 @@ int32_t syncInit() {
tsTcpPool = syncOpenTcpThreadPool(&info);
if (tsTcpPool == NULL) {
sError("failed to init tcpPool");
+ syncCleanUp();
return -1;
}
tsSyncTmrCtrl = taosTmrInit(1000, 50, 10000, "SYNC");
if (tsSyncTmrCtrl == NULL) {
sError("failed to init tmrCtrl");
- syncCloseTcpThreadPool(tsTcpPool);
- tsTcpPool = NULL;
+ syncCleanUp();
return -1;
}
tsVgIdHash = taosHashInit(TSDB_MIN_VNODES, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), true, HASH_ENTRY_LOCK);
if (tsVgIdHash == NULL) {
sError("failed to init vgIdHash");
- taosTmrCleanUp(tsSyncTmrCtrl);
- syncCloseTcpThreadPool(tsTcpPool);
- tsTcpPool = NULL;
- tsSyncTmrCtrl = NULL;
+ syncCleanUp();
return -1;
}
- tsSyncRefId = taosOpenRef(200, syncFreeNode);
- if (tsSyncRefId < 0) {
+ tsNodeRefId = taosOpenRef(200, syncFreeNode);
+ if (tsNodeRefId < 0) {
+ sError("failed to init node ref");
+ syncCleanUp();
+ return -1;
+ }
+
+ tsPeerRefId = taosOpenRef(1000, syncFreePeer);
+ if (tsPeerRefId < 0) {
+ sError("failed to init peer ref");
syncCleanUp();
return -1;
}
@@ -121,12 +133,12 @@ int32_t syncInit() {
}
void syncCleanUp() {
- if (tsTcpPool) {
+ if (tsTcpPool != NULL) {
syncCloseTcpThreadPool(tsTcpPool);
tsTcpPool = NULL;
}
- if (tsSyncTmrCtrl) {
+ if (tsSyncTmrCtrl != NULL) {
taosTmrCleanUp(tsSyncTmrCtrl);
tsSyncTmrCtrl = NULL;
}
@@ -136,8 +148,15 @@ void syncCleanUp() {
tsVgIdHash = NULL;
}
- taosCloseRef(tsSyncRefId);
- tsSyncRefId = -1;
+ if (tsNodeRefId != -1) {
+ taosCloseRef(tsNodeRefId);
+ tsNodeRefId = -1;
+ }
+
+ if (tsPeerRefId != -1) {
+ taosCloseRef(tsPeerRefId);
+ tsPeerRefId = -1;
+ }
sInfo("sync module is cleaned up");
}
@@ -170,7 +189,8 @@ int64_t syncStart(const SSyncInfo *pInfo) {
pNode->quorum = pCfg->quorum;
if (pNode->quorum > pNode->replica) pNode->quorum = pNode->replica;
- pNode->rid = taosAddRef(tsSyncRefId, pNode);
+ pNode->refCount = 1;
+ pNode->rid = taosAddRef(tsNodeRefId, pNode);
if (pNode->rid < 0) {
syncFreeNode(pNode);
return -1;
@@ -232,13 +252,18 @@ int64_t syncStart(const SSyncInfo *pInfo) {
(*pNode->notifyRole)(pNode->vgId, nodeRole);
}
+ syncStartCheckPeerConn(pNode->peerInfo[TAOS_SYNC_MAX_REPLICA]); // arb
+ for (int32_t index = 0; index < pNode->replica; ++index) {
+ syncStartCheckPeerConn(pNode->peerInfo[index]);
+ }
+
return pNode->rid;
}
void syncStop(int64_t rid) {
SSyncPeer *pPeer;
- SSyncNode *pNode = taosAcquireRef(tsSyncRefId, rid);
+ SSyncNode *pNode = syncAcquireNode(rid);
if (pNode == NULL) return;
sInfo("vgId:%d, cleanup sync", pNode->vgId);
@@ -259,14 +284,14 @@ void syncStop(int64_t rid) {
pthread_mutex_unlock(&pNode->mutex);
- taosReleaseRef(tsSyncRefId, rid);
- taosRemoveRef(tsSyncRefId, rid);
+ syncReleaseNode(pNode);
+ taosRemoveRef(tsNodeRefId, rid);
}
int32_t syncReconfig(int64_t rid, const SSyncCfg *pNewCfg) {
int32_t i, j;
- SSyncNode *pNode = taosAcquireRef(tsSyncRefId, rid);
+ SSyncNode *pNode = syncAcquireNode(rid);
if (pNode == NULL) return TSDB_CODE_SYN_INVALID_CONFIG;
sInfo("vgId:%d, reconfig, role:%s replica:%d old:%d", pNode->vgId, syncRole[nodeRole], pNewCfg->replica,
@@ -274,6 +299,11 @@ int32_t syncReconfig(int64_t rid, const SSyncCfg *pNewCfg) {
pthread_mutex_lock(&pNode->mutex);
+ syncStopCheckPeerConn(pNode->peerInfo[TAOS_SYNC_MAX_REPLICA]); // arb
+ for (int32_t index = 0; index < pNode->replica; ++index) {
+ syncStopCheckPeerConn(pNode->peerInfo[index]);
+ }
+
for (i = 0; i < pNode->replica; ++i) {
for (j = 0; j < pNewCfg->replica; ++j) {
if ((strcmp(pNode->peerInfo[i]->fqdn, pNewCfg->nodeInfo[j].nodeFqdn) == 0) &&
@@ -330,28 +360,32 @@ int32_t syncReconfig(int64_t rid, const SSyncCfg *pNewCfg) {
(*pNode->notifyRole)(pNode->vgId, nodeRole);
}
+ syncStartCheckPeerConn(pNode->peerInfo[TAOS_SYNC_MAX_REPLICA]); // arb
+ for (int32_t index = 0; index < pNode->replica; ++index) {
+ syncStartCheckPeerConn(pNode->peerInfo[index]);
+ }
+
pthread_mutex_unlock(&pNode->mutex);
sInfo("vgId:%d, %d replicas are configured, quorum:%d", pNode->vgId, pNode->replica, pNode->quorum);
syncBroadcastStatus(pNode);
- taosReleaseRef(tsSyncRefId, rid);
+ syncReleaseNode(pNode);
return 0;
}
int32_t syncForwardToPeer(int64_t rid, void *data, void *mhandle, int32_t qtype) {
- SSyncNode *pNode = taosAcquireRef(tsSyncRefId, rid);
- if (pNode == NULL) return 0;
+ SSyncNode *pNode = syncAcquireNode(rid);
+ if (pNode == NULL) return 0;
int32_t code = syncForwardToPeerImpl(pNode, data, mhandle, qtype);
- taosReleaseRef(tsSyncRefId, rid);
-
+ syncReleaseNode(pNode);
return code;
}
void syncConfirmForward(int64_t rid, uint64_t version, int32_t code) {
- SSyncNode *pNode = taosAcquireRef(tsSyncRefId, rid);
+ SSyncNode *pNode = syncAcquireNode(rid);
if (pNode == NULL) return;
SSyncPeer *pPeer = pNode->pMaster;
@@ -367,14 +401,14 @@ void syncConfirmForward(int64_t rid, uint64_t version, int32_t code) {
}
}
- taosReleaseRef(tsSyncRefId, rid);
+ syncReleaseNode(pNode);
}
#if 0
void syncRecover(int64_t rid) {
SSyncPeer *pPeer;
- SSyncNode *pNode = taosAcquireRef(tsSyncRefId, rid);
+ SSyncNode *pNode = syncAcquireNode(rid);
if (pNode == NULL) return;
// to do: add a few lines to check if recover is OK
@@ -395,12 +429,12 @@ void syncRecover(int64_t rid) {
pthread_mutex_unlock(&pNode->mutex);
- taosReleaseRef(tsSyncRefId, rid);
+ syncReleaseNode(pNode);
}
#endif
int32_t syncGetNodesRole(int64_t rid, SNodesRole *pNodesRole) {
- SSyncNode *pNode = taosAcquireRef(tsSyncRefId, rid);
+ SSyncNode *pNode = syncAcquireNode(rid);
if (pNode == NULL) return -1;
pNodesRole->selfIndex = pNode->selfIndex;
@@ -409,8 +443,7 @@ int32_t syncGetNodesRole(int64_t rid, SNodesRole *pNodesRole) {
pNodesRole->role[i] = pNode->peerInfo[i]->role;
}
- taosReleaseRef(tsSyncRefId, rid);
-
+ syncReleaseNode(pNode);
return 0;
}
@@ -446,24 +479,61 @@ static void syncAddArbitrator(SSyncNode *pNode) {
static void syncFreeNode(void *param) {
SSyncNode *pNode = param;
+ int32_t refCount = atomic_sub_fetch_32(&pNode->refCount, 1);
+ sDebug("vgId:%d, syncnode is freed, refCount:%d", pNode->vgId, refCount);
+
pthread_mutex_destroy(&pNode->mutex);
tfree(pNode->pRecv);
tfree(pNode->pSyncFwds);
tfree(pNode);
}
-void syncAddPeerRef(SSyncPeer *pPeer) { atomic_add_fetch_32(&pPeer->refCount, 1); }
-
-int32_t syncDecPeerRef(SSyncPeer *pPeer) {
- if (atomic_sub_fetch_32(&pPeer->refCount, 1) == 0) {
- taosReleaseRef(tsSyncRefId, pPeer->pSyncNode->rid);
-
- sDebug("%s, resource is freed", pPeer->id);
- tfree(pPeer);
- return 0;
+SSyncNode *syncAcquireNode(int64_t rid) {
+ SSyncNode *pNode = taosAcquireRef(tsNodeRefId, rid);
+ if (pNode == NULL) {
+ sDebug("failed to acquire syncnode from refId:%" PRId64, rid);
+ } else {
+ int32_t refCount = atomic_add_fetch_32(&pNode->refCount, 1);
+ sTrace("vgId:%d, acquire syncnode refId:%" PRId64 ", refCount:%d", pNode->vgId, rid, refCount);
}
- return 1;
+ return pNode;
+}
+
+void syncReleaseNode(SSyncNode *pNode) {
+ int32_t refCount = atomic_sub_fetch_32(&pNode->refCount, 1);
+ sTrace("vgId:%d, dec syncnode refId:%" PRId64 " refCount:%d", pNode->vgId, pNode->rid, refCount);
+
+ taosReleaseRef(tsNodeRefId, pNode->rid);
+}
+
+static void syncFreePeer(void *param) {
+ SSyncPeer *pPeer = param;
+
+ int32_t refCount = atomic_sub_fetch_32(&pPeer->refCount, 1);
+ sDebug("%s, peer is freed, refCount:%d", pPeer->id, refCount);
+
+ syncReleaseNode(pPeer->pSyncNode);
+ tfree(pPeer);
+}
+
+SSyncPeer *syncAcquirePeer(int64_t rid) {
+ SSyncPeer *pPeer = taosAcquireRef(tsPeerRefId, rid);
+ if (pPeer == NULL) {
+ sDebug("failed to acquire peer from refId:%" PRId64, rid);
+ } else {
+ int32_t refCount = atomic_add_fetch_32(&pPeer->refCount, 1);
+ sTrace("%s, acquire peer refId:%" PRId64 ", refCount:%d", pPeer->id, rid, refCount);
+ }
+
+ return pPeer;
+}
+
+void syncReleasePeer(SSyncPeer *pPeer) {
+ int32_t refCount = atomic_sub_fetch_32(&pPeer->refCount, 1);
+ sTrace("%s, dec peer refId:%" PRId64 ", refCount:%d", pPeer->id, pPeer->rid, refCount);
+
+ taosReleaseRef(tsPeerRefId, pPeer->rid);
}
static void syncClosePeerConn(SSyncPeer *pPeer) {
@@ -473,7 +543,8 @@ static void syncClosePeerConn(SSyncPeer *pPeer) {
taosClose(pPeer->syncFd);
if (pPeer->peerFd >= 0) {
pPeer->peerFd = -1;
- syncFreeTcpConn(pPeer->pConn);
+ void *pConn = pPeer->pConn;
+ if (pConn != NULL) syncFreeTcpConn(pPeer->pConn);
}
}
@@ -482,7 +553,28 @@ static void syncRemovePeer(SSyncPeer *pPeer) {
pPeer->ip = 0;
syncClosePeerConn(pPeer);
- syncDecPeerRef(pPeer);
+ //taosRemoveRef(tsPeerRefId, pPeer->rid);
+ syncReleasePeer(pPeer);
+}
+
+static void syncStartCheckPeerConn(SSyncPeer *pPeer) {
+ if (pPeer == NULL) return;
+ SSyncNode *pNode = pPeer->pSyncNode;
+
+ int32_t ret = strcmp(pPeer->fqdn, tsNodeFqdn);
+ if (pPeer->nodeId == 0 || (ret > 0) || (ret == 0 && pPeer->port > tsSyncPort)) {
+ int32_t checkMs = 100 + (pNode->vgId * 10) % 100;
+ if (pNode->vgId > 1) checkMs = tsStatusInterval * 1000 + checkMs;
+ sDebug("%s, check peer connection after %d ms", pPeer->id, checkMs);
+ taosTmrReset(syncCheckPeerConnection, checkMs, (void *)pPeer->rid, tsSyncTmrCtrl, &pPeer->timer);
+ }
+}
+
+static void syncStopCheckPeerConn(SSyncPeer *pPeer) {
+ if (pPeer == NULL) return;
+
+ taosTmrStopA(&pPeer->timer);
+ sDebug("%s, stop check peer connection", pPeer->id);
}
static SSyncPeer *syncAddPeer(SSyncNode *pNode, const SNodeInfo *pInfo) {
@@ -508,17 +600,11 @@ static SSyncPeer *syncAddPeer(SSyncNode *pNode, const SNodeInfo *pInfo) {
pPeer->role = TAOS_SYNC_ROLE_OFFLINE;
pPeer->pSyncNode = pNode;
pPeer->refCount = 1;
+ pPeer->rid = taosAddRef(tsPeerRefId, pPeer);
- sInfo("%s, it is configured, ep:%s:%u", pPeer->id, pPeer->fqdn, pPeer->port);
- int32_t ret = strcmp(pPeer->fqdn, tsNodeFqdn);
- if (pPeer->nodeId == 0 || (ret > 0) || (ret == 0 && pPeer->port > tsSyncPort)) {
- int32_t checkMs = 100 + (pNode->vgId * 10) % 100;
- if (pNode->vgId > 1) checkMs = tsStatusInterval * 1000 + checkMs;
- sDebug("%s, check peer connection after %d ms", pPeer->id, checkMs);
- taosTmrReset(syncCheckPeerConnection, checkMs, pPeer, tsSyncTmrCtrl, &pPeer->timer);
- }
+ sInfo("%s, %p it is configured, ep:%s:%u rid:%" PRId64, pPeer->id, pPeer, pPeer->fqdn, pPeer->port, pPeer->rid);
- taosAcquireRef(tsSyncRefId, pNode->rid);
+ (void)syncAcquireNode(pNode->rid);
return pPeer;
}
@@ -560,6 +646,9 @@ static void syncChooseMaster(SSyncNode *pNode) {
index = i;
}
}
+ sDebug("vgId:%d, master:%s may be choosed, index:%d", pNode->vgId, pNode->peerInfo[index]->id, index);
+ } else {
+ sDebug("vgId:%d, no master election since onlineNum:%d replica:%d", pNode->vgId, onlineNum, pNode->replica);
}
// add arbitrator connection
@@ -580,6 +669,11 @@ static void syncChooseMaster(SSyncNode *pNode) {
}
}
}
+
+ if (index >= 0) {
+ sDebug("vgId:%d, master:%s may be choosed, index:%d onlineNum(arb):%d replica:%d", pNode->vgId,
+ pNode->peerInfo[index]->id, index, onlineNum, replica);
+ }
}
if (index >= 0) {
@@ -621,9 +715,13 @@ static SSyncPeer *syncCheckMaster(SSyncNode *pNode) {
if (onlineNum <= replica * 0.5) {
if (nodeRole != TAOS_SYNC_ROLE_UNSYNCED) {
- nodeRole = TAOS_SYNC_ROLE_UNSYNCED;
+ if (nodeRole == TAOS_SYNC_ROLE_MASTER && onlineNum == replica * 0.5 && onlineNum >= 1) {
+ sInfo("vgId:%d, self keep work as master, online:%d replica:%d", pNode->vgId, onlineNum, replica);
+ } else {
+ nodeRole = TAOS_SYNC_ROLE_UNSYNCED;
+ sInfo("vgId:%d, self change to unsynced state, online:%d replica:%d", pNode->vgId, onlineNum, replica);
+ }
(*pNode->notifyRole)(pNode->vgId, nodeRole);
- sInfo("vgId:%d, self change to unsynced state, online:%d replica:%d", pNode->vgId, onlineNum, replica);
}
} else {
for (int32_t index = 0; index < pNode->replica; ++index) {
@@ -678,7 +776,7 @@ static void syncCheckRole(SSyncPeer *pPeer, SPeerStatus* peersStatus, int8_t new
if (pMaster) {
// master is there
pNode->pMaster = pMaster;
- sDebug("%s, it is the master, sver:%" PRIu64, pMaster->id, pMaster->version);
+ sDebug("%s, it is the master, replica:%d sver:%" PRIu64, pMaster->id, pNode->replica, pMaster->version);
if (syncValidateMaster(pPeer) < 0) return;
@@ -711,10 +809,10 @@ static void syncCheckRole(SSyncPeer *pPeer, SPeerStatus* peersStatus, int8_t new
}
if (consistent) {
- sDebug("vgId:%d, choose master", pNode->vgId);
+ sDebug("vgId:%d, choose master, replica:%d", pNode->vgId, pNode->replica);
syncChooseMaster(pNode);
} else {
- sDebug("vgId:%d, cannot choose master since roles inequality", pNode->vgId);
+ sDebug("vgId:%d, cannot choose master since roles inequality, replica:%d", pNode->vgId, pNode->replica);
}
}
@@ -743,7 +841,7 @@ static void syncRestartPeer(SSyncPeer *pPeer) {
int32_t ret = strcmp(pPeer->fqdn, tsNodeFqdn);
if (ret > 0 || (ret == 0 && pPeer->port > tsSyncPort)) {
sDebug("%s, check peer connection in 1000 ms", pPeer->id);
- taosTmrReset(syncCheckPeerConnection, SYNC_CHECK_INTERVAL, pPeer, tsSyncTmrCtrl, &pPeer->timer);
+ taosTmrReset(syncCheckPeerConnection, SYNC_CHECK_INTERVAL, (void *)pPeer->rid, tsSyncTmrCtrl, &pPeer->timer);
}
}
@@ -772,25 +870,30 @@ static void syncProcessSyncRequest(char *msg, SSyncPeer *pPeer) {
}
// start a new thread to retrieve the data
- syncAddPeerRef(pPeer);
+ (void)syncAcquirePeer(pPeer->rid);
+
pthread_attr_t thattr;
pthread_t thread;
pthread_attr_init(&thattr);
pthread_attr_setdetachstate(&thattr, PTHREAD_CREATE_DETACHED);
- int32_t ret = pthread_create(&thread, &thattr, syncRetrieveData, pPeer);
+ int32_t ret = pthread_create(&thread, &thattr, syncRetrieveData, (void *)pPeer->rid);
pthread_attr_destroy(&thattr);
if (ret != 0) {
sError("%s, failed to create sync thread since %s", pPeer->id, strerror(errno));
- syncDecPeerRef(pPeer);
} else {
pPeer->sstatus = TAOS_SYNC_STATUS_START;
sDebug("%s, thread is created to retrieve data, set sstatus:%s", pPeer->id, syncStatus[pPeer->sstatus]);
}
+
+ syncReleasePeer(pPeer);
}
static void syncNotStarted(void *param, void *tmrId) {
- SSyncPeer *pPeer = param;
+ int64_t rid = (int64_t)param;
+ SSyncPeer *pPeer = syncAcquirePeer(rid);
+ if (pPeer == NULL) return;
+
SSyncNode *pNode = pPeer->pSyncNode;
pthread_mutex_lock(&pNode->mutex);
@@ -799,15 +902,22 @@ static void syncNotStarted(void *param, void *tmrId) {
sInfo("%s, sync conn is still not up, restart and set sstatus:%s", pPeer->id, syncStatus[pPeer->sstatus]);
syncRestartConnection(pPeer);
pthread_mutex_unlock(&pNode->mutex);
+
+ syncReleasePeer(pPeer);
}
static void syncTryRecoverFromMaster(void *param, void *tmrId) {
- SSyncPeer *pPeer = param;
+ int64_t rid = (int64_t)param;
+ SSyncPeer *pPeer = syncAcquirePeer(rid);
+ if (pPeer == NULL) return;
+
SSyncNode *pNode = pPeer->pSyncNode;
pthread_mutex_lock(&pNode->mutex);
syncRecoverFromMaster(pPeer);
pthread_mutex_unlock(&pNode->mutex);
+
+ syncReleasePeer(pPeer);
}
static void syncRecoverFromMaster(SSyncPeer *pPeer) {
@@ -823,7 +933,7 @@ static void syncRecoverFromMaster(SSyncPeer *pPeer) {
// Ensure the sync of mnode not interrupted
if (pNode->vgId != 1 && tsSyncNum >= SYNC_MAX_NUM) {
sInfo("%s, %d syncs are in process, try later", pPeer->id, tsSyncNum);
- taosTmrReset(syncTryRecoverFromMaster, 500 + (pNode->vgId * 10) % 200, pPeer, tsSyncTmrCtrl, &pPeer->timer);
+ taosTmrReset(syncTryRecoverFromMaster, 500 + (pNode->vgId * 10) % 200, (void *)pPeer->rid, tsSyncTmrCtrl, &pPeer->timer);
return;
}
@@ -832,7 +942,7 @@ static void syncRecoverFromMaster(SSyncPeer *pPeer) {
SSyncMsg msg;
syncBuildSyncReqMsg(&msg, pNode->vgId);
- taosTmrReset(syncNotStarted, SYNC_CHECK_INTERVAL, pPeer, tsSyncTmrCtrl, &pPeer->timer);
+ taosTmrReset(syncNotStarted, SYNC_CHECK_INTERVAL, (void *)pPeer->rid, tsSyncTmrCtrl, &pPeer->timer);
if (taosWriteMsg(pPeer->peerFd, &msg, sizeof(SSyncMsg)) != sizeof(SSyncMsg)) {
sError("%s, failed to send sync-req to peer", pPeer->id);
@@ -920,8 +1030,10 @@ static int32_t syncReadPeerMsg(SSyncPeer *pPeer, SSyncHead *pHead) {
return 0;
}
-static int32_t syncProcessPeerMsg(void *param, void *buffer) {
- SSyncPeer *pPeer = param;
+static int32_t syncProcessPeerMsg(int64_t rid, void *buffer) {
+ SSyncPeer *pPeer = syncAcquirePeer(rid);
+ if (pPeer == NULL) return -1;
+
SSyncHead *pHead = buffer;
SSyncNode *pNode = pPeer->pSyncNode;
@@ -942,12 +1054,17 @@ static int32_t syncProcessPeerMsg(void *param, void *buffer) {
}
pthread_mutex_unlock(&pNode->mutex);
+ syncReleasePeer(pPeer);
return code;
}
-static void syncSendPeersStatusMsgToPeer(SSyncPeer *pPeer, char ack, int8_t type, uint16_t tranId) {
- if (pPeer->peerFd < 0 || pPeer->ip == 0) return;
+static int32_t syncSendPeersStatusMsgToPeer(SSyncPeer *pPeer, char ack, int8_t type, uint16_t tranId) {
+ if (pPeer->peerFd < 0 || pPeer->ip == 0) {
+ sDebug("%s, failed to send status msg, restart fd:%d", pPeer->id, pPeer->peerFd);
+ syncRestartConnection(pPeer);
+ return -1;
+ }
SSyncNode * pNode = pPeer->pSyncNode;
SPeersStatus msg;
@@ -970,9 +1087,11 @@ static void syncSendPeersStatusMsgToPeer(SSyncPeer *pPeer, char ack, int8_t type
sDebug("%s, status is sent, self:%s:%s:%" PRIu64 ", peer:%s:%s:%" PRIu64 ", ack:%d tranId:%u type:%s pfd:%d",
pPeer->id, syncRole[nodeRole], syncStatus[nodeSStatus], nodeVersion, syncRole[pPeer->role],
syncStatus[pPeer->sstatus], pPeer->version, ack, tranId, statusType[type], pPeer->peerFd);
+ return 0;
} else {
sDebug("%s, failed to send status msg, restart", pPeer->id);
syncRestartConnection(pPeer);
+ return -1;
}
}
@@ -989,7 +1108,7 @@ static void syncSetupPeerConnection(SSyncPeer *pPeer) {
int32_t connFd = taosOpenTcpClientSocket(pPeer->ip, pPeer->port, 0);
if (connFd < 0) {
sDebug("%s, failed to open tcp socket since %s", pPeer->id, strerror(errno));
- taosTmrReset(syncCheckPeerConnection, SYNC_CHECK_INTERVAL, pPeer, tsSyncTmrCtrl, &pPeer->timer);
+ taosTmrReset(syncCheckPeerConnection, SYNC_CHECK_INTERVAL, (void *)pPeer->rid, tsSyncTmrCtrl, &pPeer->timer);
return;
}
@@ -1000,17 +1119,19 @@ static void syncSetupPeerConnection(SSyncPeer *pPeer) {
sDebug("%s, connection to peer server is setup, pfd:%d sfd:%d tranId:%u", pPeer->id, connFd, pPeer->syncFd, msg.tranId);
pPeer->peerFd = connFd;
pPeer->role = TAOS_SYNC_ROLE_UNSYNCED;
- pPeer->pConn = syncAllocateTcpConn(tsTcpPool, pPeer, connFd);
- syncAddPeerRef(pPeer);
+ pPeer->pConn = syncAllocateTcpConn(tsTcpPool, pPeer->rid, connFd);
} else {
sDebug("%s, failed to setup peer connection to server since %s, try later", pPeer->id, strerror(errno));
taosClose(connFd);
- taosTmrReset(syncCheckPeerConnection, SYNC_CHECK_INTERVAL, pPeer, tsSyncTmrCtrl, &pPeer->timer);
+ taosTmrReset(syncCheckPeerConnection, SYNC_CHECK_INTERVAL, (void *)pPeer->rid, tsSyncTmrCtrl, &pPeer->timer);
}
}
static void syncCheckPeerConnection(void *param, void *tmrId) {
- SSyncPeer *pPeer = param;
+ int64_t rid = (int64_t)param;
+ SSyncPeer *pPeer = syncAcquirePeer(rid);
+ if (pPeer == NULL) return;
+
SSyncNode *pNode = pPeer->pSyncNode;
pthread_mutex_lock(&pNode->mutex);
@@ -1019,6 +1140,8 @@ static void syncCheckPeerConnection(void *param, void *tmrId) {
syncSetupPeerConnection(pPeer);
pthread_mutex_unlock(&pNode->mutex);
+
+ syncReleasePeer(pPeer);
}
static void syncCreateRestoreDataThread(SSyncPeer *pPeer) {
@@ -1029,8 +1152,9 @@ static void syncCreateRestoreDataThread(SSyncPeer *pPeer) {
pthread_attr_init(&thattr);
pthread_attr_setdetachstate(&thattr, PTHREAD_CREATE_DETACHED);
- syncAddPeerRef(pPeer);
- int32_t ret = pthread_create(&(thread), &thattr, (void *)syncRestoreData, pPeer);
+ (void)syncAcquirePeer(pPeer->rid);
+
+ int32_t ret = pthread_create(&(thread), &thattr, (void *)syncRestoreData, (void *)pPeer->rid);
pthread_attr_destroy(&thattr);
if (ret < 0) {
@@ -1038,10 +1162,11 @@ static void syncCreateRestoreDataThread(SSyncPeer *pPeer) {
nodeSStatus = TAOS_SYNC_STATUS_INIT;
sError("%s, failed to create sync thread, set sstatus:%s", pPeer->id, syncStatus[nodeSStatus]);
taosClose(pPeer->syncFd);
- syncDecPeerRef(pPeer);
} else {
sInfo("%s, sync connection is up", pPeer->id);
}
+
+ syncReleasePeer(pPeer);
}
static void syncProcessIncommingConnection(int32_t connFd, uint32_t sourceIp) {
@@ -1073,7 +1198,7 @@ static void syncProcessIncommingConnection(int32_t connFd, uint32_t sourceIp) {
return;
}
- sDebug("vgId:%d, sync msg is received, tranId:%u", vgId, msg.tranId);
+ sDebug("vgId:%d, sync connection is incomming, tranId:%u", vgId, msg.tranId);
SSyncNode *pNode = *ppNode;
pthread_mutex_lock(&pNode->mutex);
@@ -1101,8 +1226,7 @@ static void syncProcessIncommingConnection(int32_t connFd, uint32_t sourceIp) {
sDebug("%s, TCP connection is up, pfd:%d sfd:%d, old pfd:%d", pPeer->id, connFd, pPeer->syncFd, pPeer->peerFd);
syncClosePeerConn(pPeer);
pPeer->peerFd = connFd;
- pPeer->pConn = syncAllocateTcpConn(tsTcpPool, pPeer, connFd);
- syncAddPeerRef(pPeer);
+ pPeer->pConn = syncAllocateTcpConn(tsTcpPool, pPeer->rid, connFd);
sDebug("%s, ready to exchange data", pPeer->id);
syncSendPeersStatusMsgToPeer(pPeer, 1, SYNC_STATUS_EXCHANGE_DATA, syncGenTranId());
}
@@ -1111,23 +1235,21 @@ static void syncProcessIncommingConnection(int32_t connFd, uint32_t sourceIp) {
pthread_mutex_unlock(&pNode->mutex);
}
-static void syncProcessBrokenLink(void *param) {
- if (param == NULL) return; // the connection for arbitrator
- SSyncPeer *pPeer = param;
+static void syncProcessBrokenLink(int64_t rid) {
+ SSyncPeer *pPeer = syncAcquirePeer(rid);
+ if (pPeer == NULL) return;
+
SSyncNode *pNode = pPeer->pSyncNode;
- if (taosAcquireRef(tsSyncRefId, pNode->rid) == NULL) return;
pthread_mutex_lock(&pNode->mutex);
sDebug("%s, TCP link is broken since %s, pfd:%d sfd:%d", pPeer->id, strerror(errno), pPeer->peerFd, pPeer->syncFd);
pPeer->peerFd = -1;
- if (syncDecPeerRef(pPeer) != 0) {
- syncRestartConnection(pPeer);
- }
-
+ syncRestartConnection(pPeer);
pthread_mutex_unlock(&pNode->mutex);
- taosReleaseRef(tsSyncRefId, pNode->rid);
+
+ syncReleasePeer(pPeer);
}
static int32_t syncSaveFwdInfo(SSyncNode *pNode, uint64_t version, void *mhandle) {
@@ -1198,7 +1320,7 @@ static void syncProcessFwdAck(SSyncNode *pNode, SFwdInfo *pFwdInfo, int32_t code
static void syncMonitorNodeRole(void *param, void *tmrId) {
int64_t rid = (int64_t)param;
- SSyncNode *pNode = taosAcquireRef(tsSyncRefId, rid);
+ SSyncNode *pNode = syncAcquireNode(rid);
if (pNode == NULL) return;
for (int32_t index = 0; index < pNode->replica; index++) {
@@ -1215,12 +1337,12 @@ static void syncMonitorNodeRole(void *param, void *tmrId) {
}
pNode->pRoleTimer = taosTmrStart(syncMonitorNodeRole, SYNC_ROLE_TIMER, (void *)pNode->rid, tsSyncTmrCtrl);
- taosReleaseRef(tsSyncRefId, rid);
+ syncReleaseNode(pNode);
}
static void syncMonitorFwdInfos(void *param, void *tmrId) {
int64_t rid = (int64_t)param;
- SSyncNode *pNode = taosAcquireRef(tsSyncRefId, rid);
+ SSyncNode *pNode = syncAcquireNode(rid);
if (pNode == NULL) return;
SSyncFwds *pSyncFwds = pNode->pSyncFwds;
@@ -1246,7 +1368,7 @@ static void syncMonitorFwdInfos(void *param, void *tmrId) {
pNode->pFwdTimer = taosTmrStart(syncMonitorFwdInfos, SYNC_FWD_TIMER, (void *)pNode->rid, tsSyncTmrCtrl);
}
- taosReleaseRef(tsSyncRefId, rid);
+ syncReleaseNode(pNode);
}
static int32_t syncForwardToPeerImpl(SSyncNode *pNode, void *data, void *mhandle, int32_t qtype) {
diff --git a/src/sync/src/syncRestore.c b/src/sync/src/syncRestore.c
index 8651879eb6..e815594883 100644
--- a/src/sync/src/syncRestore.c
+++ b/src/sync/src/syncRestore.c
@@ -90,15 +90,18 @@ static int32_t syncRestoreFile(SSyncPeer *pPeer, uint64_t *fversion) {
break;
}
+ sDebug("%s, file:%s info is received from master, index:%d size:%" PRId64 " fver:%" PRIu64 " magic:%d", pPeer->id,
+ minfo.name, minfo.index, minfo.size, minfo.fversion, minfo.magic);
+
// remove extra files on slave between the current and last index
syncRemoveExtraFile(pPeer, pindex + 1, minfo.index - 1);
pindex = minfo.index;
// check the file info
sinfo = minfo;
- sDebug("%s, get file:%s info size:%" PRId64, pPeer->id, minfo.name, minfo.size);
- sinfo.magic = (*pNode->getFileInfo)(pNode->vgId, sinfo.name, &sinfo.index, TAOS_SYNC_MAX_INDEX, &sinfo.size,
- &sinfo.fversion);
+ sinfo.magic = (*pNode->getFileInfo)(pNode->vgId, sinfo.name, &sinfo.index, TAOS_SYNC_MAX_INDEX, &sinfo.size, &sinfo.fversion);
+ sDebug("%s, local file:%s info, index:%d size:%" PRId64 " fver:%" PRIu64 " magic:%d", pPeer->id, sinfo.name,
+ sinfo.index, sinfo.size, sinfo.fversion, sinfo.magic);
// if file not there or magic is not the same, file shall be synced
memset(&fileAck, 0, sizeof(SFileAck));
@@ -116,6 +119,8 @@ static int32_t syncRestoreFile(SSyncPeer *pPeer, uint64_t *fversion) {
if (fileAck.sync == 0) {
sDebug("%s, %s is the same", pPeer->id, minfo.name);
continue;
+ } else {
+ sDebug("%s, %s will be received, size:%" PRId64, pPeer->id, minfo.name, minfo.size);
}
// if sync is required, open file, receive from master, and write to file
@@ -155,7 +160,7 @@ static int32_t syncRestoreFile(SSyncPeer *pPeer, uint64_t *fversion) {
return code;
}
-static int32_t syncRestoreWal(SSyncPeer *pPeer) {
+static int32_t syncRestoreWal(SSyncPeer *pPeer, uint64_t *wver) {
SSyncNode *pNode = pPeer->pSyncNode;
int32_t ret, code = -1;
uint64_t lastVer = 0;
@@ -198,6 +203,7 @@ static int32_t syncRestoreWal(SSyncPeer *pPeer) {
}
free(pHead);
+ *wver = lastVer;
return code;
}
@@ -321,12 +327,19 @@ static int32_t syncRestoreDataStepByStep(SSyncPeer *pPeer) {
nodeVersion = fversion;
- sInfo("%s, start to restore wal", pPeer->id);
- if (syncRestoreWal(pPeer) < 0) {
- sError("%s, failed to restore wal", pPeer->id);
+ sInfo("%s, start to restore wal, fver:%" PRIu64, pPeer->id, nodeVersion);
+ uint64_t wver = 0;
+ code = syncRestoreWal(pPeer, &wver); // lastwar
+ if (code < 0) {
+ sError("%s, failed to restore wal, code:%d", pPeer->id, code);
return -1;
}
+ if (wver != 0) {
+ nodeVersion = wver;
+ sDebug("%s, restore wal finished, set sver:%" PRIu64, pPeer->id, nodeVersion);
+ }
+
nodeSStatus = TAOS_SYNC_STATUS_CACHE;
sInfo("%s, start to insert buffered points, set sstatus:%s", pPeer->id, syncStatus[nodeSStatus]);
if (syncProcessBufferedFwd(pPeer) < 0) {
@@ -338,7 +351,10 @@ static int32_t syncRestoreDataStepByStep(SSyncPeer *pPeer) {
}
void *syncRestoreData(void *param) {
- SSyncPeer *pPeer = param;
+ int64_t rid = (int64_t)param;
+ SSyncPeer *pPeer = syncAcquirePeer(rid);
+ if (pPeer == NULL) return NULL;
+
SSyncNode *pNode = pPeer->pSyncNode;
taosBlockSIGPIPE();
@@ -369,7 +385,7 @@ void *syncRestoreData(void *param) {
taosClose(pPeer->syncFd);
syncCloseRecvBuffer(pNode);
__sync_fetch_and_sub(&tsSyncNum, 1);
- syncDecPeerRef(pPeer);
+ syncReleasePeer(pPeer);
return NULL;
}
diff --git a/src/sync/src/syncRetrieve.c b/src/sync/src/syncRetrieve.c
index 02d990313e..f3e0a6d353 100644
--- a/src/sync/src/syncRetrieve.c
+++ b/src/sync/src/syncRetrieve.c
@@ -104,7 +104,8 @@ static int32_t syncRetrieveFile(SSyncPeer *pPeer) {
fileInfo.magic = (*pNode->getFileInfo)(pNode->vgId, fileInfo.name, &fileInfo.index, TAOS_SYNC_MAX_INDEX,
&fileInfo.size, &fileInfo.fversion);
syncBuildFileInfo(&fileInfo, pNode->vgId);
- sDebug("%s, file:%s info is sent, size:%" PRId64, pPeer->id, fileInfo.name, fileInfo.size);
+ sDebug("%s, file:%s info is sent, index:%d size:%" PRId64 " fver:%" PRIu64 " magic:%d", pPeer->id, fileInfo.name,
+ fileInfo.index, fileInfo.size, fileInfo.fversion, fileInfo.magic);
// send the file info
int32_t ret = taosWriteMsg(pPeer->syncFd, &(fileInfo), sizeof(SFileInfo));
@@ -144,6 +145,8 @@ static int32_t syncRetrieveFile(SSyncPeer *pPeer) {
fileInfo.index++;
sDebug("%s, %s is the same", pPeer->id, fileInfo.name);
continue;
+ } else {
+ sDebug("%s, %s will be sent", pPeer->id, fileInfo.name);
}
// get the full path to file
@@ -461,7 +464,10 @@ static int32_t syncRetrieveDataStepByStep(SSyncPeer *pPeer) {
}
void *syncRetrieveData(void *param) {
- SSyncPeer *pPeer = (SSyncPeer *)param;
+ int64_t rid = (int64_t)param;
+ SSyncPeer *pPeer = syncAcquirePeer(rid);
+ if (pPeer == NULL) return NULL;
+
SSyncNode *pNode = pPeer->pSyncNode;
taosBlockSIGPIPE();
@@ -490,7 +496,7 @@ void *syncRetrieveData(void *param) {
pPeer->fileChanged = 0;
taosClose(pPeer->syncFd);
- syncDecPeerRef(pPeer);
+ syncReleasePeer(pPeer);
return NULL;
}
diff --git a/src/sync/src/syncTcp.c b/src/sync/src/syncTcp.c
index 7bfdc4e440..4744666737 100644
--- a/src/sync/src/syncTcp.c
+++ b/src/sync/src/syncTcp.c
@@ -42,7 +42,7 @@ typedef struct SPoolObj {
typedef struct {
SThreadObj *pThread;
- void * ahandle;
+ int64_t handleId;
int32_t fd;
int32_t closedByApp;
} SConnObj;
@@ -112,7 +112,7 @@ void syncCloseTcpThreadPool(void *param) {
tfree(pPool);
}
-void *syncAllocateTcpConn(void *param, void *pPeer, int32_t connFd) {
+void *syncAllocateTcpConn(void *param, int64_t rid, int32_t connFd) {
struct epoll_event event;
SPoolObj *pPool = param;
@@ -130,7 +130,7 @@ void *syncAllocateTcpConn(void *param, void *pPeer, int32_t connFd) {
pConn->fd = connFd;
pConn->pThread = pThread;
- pConn->ahandle = pPeer;
+ pConn->handleId = rid;
pConn->closedByApp = 0;
event.events = EPOLLIN | EPOLLRDHUP;
@@ -164,7 +164,7 @@ static void taosProcessBrokenLink(SConnObj *pConn) {
SPoolInfo * pInfo = &pPool->info;
if (pConn->closedByApp == 0) shutdown(pConn->fd, SHUT_WR);
- (*pInfo->processBrokenLink)(pConn->ahandle);
+ (*pInfo->processBrokenLink)(pConn->handleId);
pThread->numOfFds--;
epoll_ctl(pThread->pollFd, EPOLL_CTL_DEL, pConn->fd, NULL);
@@ -221,7 +221,7 @@ static void *syncProcessTcpData(void *param) {
}
if (pConn->closedByApp == 0) {
- if ((*pInfo->processIncomingMsg)(pConn->ahandle, buffer) < 0) {
+ if ((*pInfo->processIncomingMsg)(pConn->handleId, buffer) < 0) {
syncFreeTcpConn(pConn);
continue;
}
diff --git a/src/tsdb/inc/tsdbMain.h b/src/tsdb/inc/tsdbMain.h
index 5c978abd1d..5067974903 100644
--- a/src/tsdb/inc/tsdbMain.h
+++ b/src/tsdb/inc/tsdbMain.h
@@ -31,19 +31,19 @@
extern "C" {
#endif
-extern int tsdbDebugFlag;
+extern int32_t tsdbDebugFlag;
-#define tsdbFatal(...) { if (tsdbDebugFlag & DEBUG_FATAL) { taosPrintLog("TDB FATAL ", 255, __VA_ARGS__); }}
-#define tsdbError(...) { if (tsdbDebugFlag & DEBUG_ERROR) { taosPrintLog("TDB ERROR ", 255, __VA_ARGS__); }}
-#define tsdbWarn(...) { if (tsdbDebugFlag & DEBUG_WARN) { taosPrintLog("TDB WARN ", 255, __VA_ARGS__); }}
-#define tsdbInfo(...) { if (tsdbDebugFlag & DEBUG_INFO) { taosPrintLog("TDB ", 255, __VA_ARGS__); }}
-#define tsdbDebug(...) { if (tsdbDebugFlag & DEBUG_DEBUG) { taosPrintLog("TDB ", tsdbDebugFlag, __VA_ARGS__); }}
-#define tsdbTrace(...) { if (tsdbDebugFlag & DEBUG_TRACE) { taosPrintLog("TDB ", tsdbDebugFlag, __VA_ARGS__); }}
+#define tsdbFatal(...) do { if (tsdbDebugFlag & DEBUG_FATAL) { taosPrintLog("TDB FATAL ", 255, __VA_ARGS__); }} while(0)
+#define tsdbError(...) do { if (tsdbDebugFlag & DEBUG_ERROR) { taosPrintLog("TDB ERROR ", 255, __VA_ARGS__); }} while(0)
+#define tsdbWarn(...) do { if (tsdbDebugFlag & DEBUG_WARN) { taosPrintLog("TDB WARN ", 255, __VA_ARGS__); }} while(0)
+#define tsdbInfo(...) do { if (tsdbDebugFlag & DEBUG_INFO) { taosPrintLog("TDB ", 255, __VA_ARGS__); }} while(0)
+#define tsdbDebug(...) do { if (tsdbDebugFlag & DEBUG_DEBUG) { taosPrintLog("TDB ", tsdbDebugFlag, __VA_ARGS__); }} while(0)
+#define tsdbTrace(...) do { if (tsdbDebugFlag & DEBUG_TRACE) { taosPrintLog("TDB ", tsdbDebugFlag, __VA_ARGS__); }} while(0)
#define TSDB_MAX_TABLE_SCHEMAS 16
-#define TSDB_FILE_HEAD_SIZE 512
-#define TSDB_FILE_DELIMITER 0xF00AFA0F
-#define TSDB_FILE_INIT_MAGIC 0xFFFFFFFF
+#define TSDB_FILE_HEAD_SIZE 512
+#define TSDB_FILE_DELIMITER 0xF00AFA0F
+#define TSDB_FILE_INIT_MAGIC 0xFFFFFFFF
#define TAOS_IN_RANGE(key, keyMin, keyLast) (((key) >= (keyMin)) && ((key) <= (keyMax)))
@@ -66,7 +66,8 @@ typedef struct STable {
SSkipList* pIndex; // For TSDB_SUPER_TABLE, it is the skiplist index
void* eventHandler; // TODO
void* streamHandler; // TODO
- TSKEY lastKey; // lastkey inserted in this table, initialized as 0, TODO: make a structure
+ TSKEY lastKey;
+ SDataRow lastRow;
char* sql;
void* cqhandle;
SRWLatch latch; // TODO: implementa latch functions
@@ -360,8 +361,11 @@ typedef struct {
#define TABLE_UID(t) (t)->tableId.uid
#define TABLE_TID(t) (t)->tableId.tid
#define TABLE_SUID(t) (t)->suid
-#define TABLE_LASTKEY(t) (t)->lastKey
#define TSDB_META_FILE_MAGIC(m) KVSTORE_MAGIC((m)->pStore)
+#define TSDB_RLOCK_TABLE(t) taosRLockLatch(&((t)->latch))
+#define TSDB_RUNLOCK_TABLE(t) taosRUnLockLatch(&((t)->latch))
+#define TSDB_WLOCK_TABLE(t) taosWLockLatch(&((t)->latch))
+#define TSDB_WUNLOCK_TABLE(t) taosWUnLockLatch(&((t)->latch))
STsdbMeta* tsdbNewMeta(STsdbCfg* pCfg);
void tsdbFreeMeta(STsdbMeta* pMeta);
@@ -391,7 +395,7 @@ static FORCE_INLINE STSchema* tsdbGetTableSchemaImpl(STable* pTable, bool lock,
STSchema* pSchema = NULL;
STSchema* pTSchema = NULL;
- if (lock) taosRLockLatch(&(pDTable->latch));
+ if (lock) TSDB_RLOCK_TABLE(pDTable);
if (version < 0) { // get the latest version of schema
pTSchema = pDTable->schema[pDTable->numOfSchemas - 1];
} else { // get the schema with version
@@ -413,7 +417,7 @@ static FORCE_INLINE STSchema* tsdbGetTableSchemaImpl(STable* pTable, bool lock,
}
_exit:
- if (lock) taosRUnLockLatch(&(pDTable->latch));
+ if (lock) TSDB_RUNLOCK_TABLE(pDTable);
return pSchema;
}
@@ -433,6 +437,11 @@ static FORCE_INLINE STSchema *tsdbGetTableTagSchema(STable *pTable) {
}
}
+static FORCE_INLINE TSKEY tsdbGetTableLastKeyImpl(STable* pTable) {
+ ASSERT(pTable->lastRow == NULL || pTable->lastKey == dataRowKey(pTable->lastRow));
+ return pTable->lastKey;
+}
+
// ------------------ tsdbBuffer.c
#define TSDB_BUFFER_RESERVE 1024 // Reseve 1K as commit threshold
diff --git a/src/tsdb/src/tsdbCommit.c b/src/tsdb/src/tsdbCommit.c
index 637b02cd32..696270d670 100644
--- a/src/tsdb/src/tsdbCommit.c
+++ b/src/tsdb/src/tsdbCommit.c
@@ -161,6 +161,11 @@ _err:
static void tsdbEndCommit(STsdbRepo *pRepo, int eno) {
if (pRepo->appH.notifyStatus) pRepo->appH.notifyStatus(pRepo->appH.appH, TSDB_STATUS_COMMIT_OVER, eno);
+ SMemTable *pIMem = pRepo->imem;
+ tsdbLockRepo(pRepo);
+ pRepo->imem = NULL;
+ tsdbUnlockRepo(pRepo);
+ tsdbUnRefMemTable(pRepo, pIMem);
sem_post(&(pRepo->readyToCommit));
}
@@ -220,7 +225,7 @@ static int tsdbCommitToFile(STsdbRepo *pRepo, int fid, SCommitIter *iters, SRWHe
SCommitIter *pIter = iters + tid;
if (pIter->pTable == NULL) continue;
- taosRLockLatch(&(pIter->pTable->latch));
+ TSDB_RLOCK_TABLE(pIter->pTable);
if (tsdbSetHelperTable(pHelper, pIter->pTable, pRepo) < 0) goto _err;
@@ -231,7 +236,7 @@ static int tsdbCommitToFile(STsdbRepo *pRepo, int fid, SCommitIter *iters, SRWHe
}
if (tsdbCommitTableData(pHelper, pIter, pDataCols, maxKey) < 0) {
- taosRUnLockLatch(&(pIter->pTable->latch));
+ TSDB_RUNLOCK_TABLE(pIter->pTable);
tsdbError("vgId:%d failed to write data of table %s tid %d uid %" PRIu64 " since %s", REPO_ID(pRepo),
TABLE_CHAR_NAME(pIter->pTable), TABLE_TID(pIter->pTable), TABLE_UID(pIter->pTable),
tstrerror(terrno));
@@ -239,7 +244,7 @@ static int tsdbCommitToFile(STsdbRepo *pRepo, int fid, SCommitIter *iters, SRWHe
}
}
- taosRUnLockLatch(&(pIter->pTable->latch));
+ TSDB_RUNLOCK_TABLE(pIter->pTable);
// Move the last block to the new .l file if neccessary
if (tsdbMoveLastBlockIfNeccessary(pHelper) < 0) {
diff --git a/src/tsdb/src/tsdbMain.c b/src/tsdb/src/tsdbMain.c
index 9d65325001..b34b2fa9e6 100644
--- a/src/tsdb/src/tsdbMain.c
+++ b/src/tsdb/src/tsdbMain.c
@@ -77,9 +77,9 @@ int32_t tsdbCreateRepo(char *rootDir, STsdbCfg *pCfg) {
tsdbDebug(
"vgId:%d tsdb env create succeed! cacheBlockSize %d totalBlocks %d daysPerFile %d keep "
- "%d minRowsPerFileBlock %d maxRowsPerFileBlock %d precision %d compression %d",
+ "%d minRowsPerFileBlock %d maxRowsPerFileBlock %d precision %d compression %d update %d cacheLastRow %d",
pCfg->tsdbId, pCfg->cacheBlockSize, pCfg->totalBlocks, pCfg->daysPerFile, pCfg->keep, pCfg->minRowsPerFileBlock,
- pCfg->maxRowsPerFileBlock, pCfg->precision, pCfg->compression);
+ pCfg->maxRowsPerFileBlock, pCfg->precision, pCfg->compression, pCfg->update, pCfg->cacheLastRow);
return 0;
}
@@ -281,6 +281,10 @@ int32_t tsdbConfigRepo(TSDB_REPO_T *repo, STsdbCfg *pCfg) {
config.totalBlocks = pCfg->totalBlocks;
configChanged = true;
}
+ if (pRCfg->cacheLastRow != pCfg->cacheLastRow) {
+ config.cacheLastRow = pCfg->cacheLastRow;
+ configChanged = true;
+ }
if (configChanged) {
if (tsdbSaveConfig(pRepo->rootDir, &config) < 0) {
@@ -475,6 +479,9 @@ static int32_t tsdbCheckAndSetDefaultCfg(STsdbCfg *pCfg) {
// update check
if (pCfg->update != 0) pCfg->update = 1;
+ // update cacheLastRow
+ if (pCfg->cacheLastRow != 0) pCfg->cacheLastRow = 1;
+
return 0;
_err:
@@ -692,10 +699,12 @@ static void tsdbFreeRepo(STsdbRepo *pRepo) {
}
}
-static int tsdbRestoreInfo(STsdbRepo *pRepo) {
+static int tsdbRestoreInfo(STsdbRepo *pRepo) { // TODO
STsdbMeta * pMeta = pRepo->tsdbMeta;
STsdbFileH *pFileH = pRepo->tsdbFileH;
SFileGroup *pFGroup = NULL;
+ STsdbCfg * pCfg = &(pRepo->config);
+ SCompBlock *pBlock = NULL;
SFileGroupIter iter;
SRWHelper rhelper = {0};
@@ -713,7 +722,32 @@ static int tsdbRestoreInfo(STsdbRepo *pRepo) {
if (tsdbSetHelperTable(&rhelper, pTable, pRepo) < 0) goto _err;
SCompIdx *pIdx = &(rhelper.curCompIdx);
- if (pIdx->offset > 0 && pTable->lastKey < pIdx->maxKey) pTable->lastKey = pIdx->maxKey;
+ TSKEY lastKey = tsdbGetTableLastKeyImpl(pTable);
+ if (pIdx->offset > 0 && lastKey < pIdx->maxKey) {
+ pTable->lastKey = pIdx->maxKey;
+ if (pCfg->cacheLastRow) { // load the block of data
+ if (tsdbLoadCompInfo(&rhelper, NULL) < 0) goto _err;
+
+ pBlock = rhelper.pCompInfo->blocks + pIdx->numOfBlocks - 1;
+ if (tsdbLoadBlockData(&rhelper, pBlock, NULL) < 0) goto _err;
+
+ // construct the data row
+ ASSERT(pTable->lastRow == NULL);
+ STSchema *pSchema = tsdbGetTableSchema(pTable);
+ pTable->lastRow = taosTMalloc(schemaTLen(pSchema));
+ if (pTable->lastRow == NULL) {
+ goto _err;
+ }
+
+ tdInitDataRow(pTable->lastRow, pSchema);
+ for (int icol = 0; icol < schemaNCols(pSchema); icol++) {
+ STColumn *pCol = schemaColAt(pSchema, icol);
+ SDataCol *pDataCol = rhelper.pDataCols[0]->cols + icol;
+ tdAppendColVal(pTable->lastRow, tdGetColDataOfRow(pDataCol, pBlock->numOfRows - 1), pCol->type, pCol->bytes,
+ pCol->offset);
+ }
+ }
+ }
}
}
@@ -800,6 +834,7 @@ static int tsdbEncodeCfg(void **buf, STsdbCfg *pCfg) {
tlen += taosEncodeFixedI8(buf, pCfg->precision);
tlen += taosEncodeFixedI8(buf, pCfg->compression);
tlen += taosEncodeFixedI8(buf, pCfg->update);
+ tlen += taosEncodeFixedI8(buf, pCfg->cacheLastRow);
return tlen;
}
@@ -817,6 +852,7 @@ static void *tsdbDecodeCfg(void *buf, STsdbCfg *pCfg) {
buf = taosDecodeFixedI8(buf, &(pCfg->precision));
buf = taosDecodeFixedI8(buf, &(pCfg->compression));
buf = taosDecodeFixedI8(buf, &(pCfg->update));
+ buf = taosDecodeFixedI8(buf, &(pCfg->cacheLastRow));
return buf;
}
diff --git a/src/tsdb/src/tsdbMemTable.c b/src/tsdb/src/tsdbMemTable.c
index 999e2deb41..87bc7b9443 100644
--- a/src/tsdb/src/tsdbMemTable.c
+++ b/src/tsdb/src/tsdbMemTable.c
@@ -17,6 +17,7 @@
#include "tsdbMain.h"
#define TSDB_DATA_SKIPLIST_LEVEL 5
+#define TSDB_MAX_INSERT_BATCH 512
static SMemTable * tsdbNewMemTable(STsdbRepo *pRepo);
static void tsdbFreeMemTable(SMemTable *pMemTable);
@@ -35,6 +36,7 @@ static int tsdbGetSubmitMsgNext(SSubmitMsgIter *pIter, SSubmitBlk **pPB
static int tsdbCheckTableSchema(STsdbRepo *pRepo, SSubmitBlk *pBlock, STable *pTable);
static int tsdbInsertDataToTableImpl(STsdbRepo *pRepo, STable *pTable, void **rows, int rowCounter);
static void tsdbFreeRows(STsdbRepo *pRepo, void **rows, int rowCounter);
+static int tsdbUpdateTableLatestInfo(STsdbRepo *pRepo, STable *pTable, SDataRow row);
static FORCE_INLINE int tsdbCheckRowRange(STsdbRepo *pRepo, STable *pTable, SDataRow row, TSKEY minKey, TSKEY maxKey,
TSKEY now);
@@ -205,7 +207,7 @@ void *tsdbAllocBytes(STsdbRepo *pRepo, int bytes) {
int tsdbAsyncCommit(STsdbRepo *pRepo) {
if (pRepo->mem == NULL) return 0;
- SMemTable *pIMem = pRepo->imem;
+ ASSERT(pRepo->imem == NULL);
sem_wait(&(pRepo->readyToCommit));
@@ -220,8 +222,6 @@ int tsdbAsyncCommit(STsdbRepo *pRepo) {
tsdbScheduleCommit(pRepo);
if (tsdbUnlockRepo(pRepo) < 0) return -1;
- if (tsdbUnRefMemTable(pRepo, pIMem) < 0) return -1;
-
return 0;
}
@@ -606,19 +606,13 @@ static int tsdbInsertDataToTable(STsdbRepo *pRepo, SSubmitBlk *pBlock, int32_t *
STable * pTable = NULL;
SSubmitBlkIter blkIter = {0};
SDataRow row = NULL;
- void ** rows = NULL;
+ void * rows[TSDB_MAX_INSERT_BATCH] = {0};
int rowCounter = 0;
ASSERT(pBlock->tid < pMeta->maxTables);
pTable = pMeta->tables[pBlock->tid];
ASSERT(pTable != NULL && TABLE_UID(pTable) == pBlock->uid);
- rows = (void **)calloc(pBlock->numOfRows, sizeof(void *));
- if (rows == NULL) {
- terrno = TSDB_CODE_TDB_OUT_OF_MEMORY;
- return -1;
- }
-
tsdbInitSubmitBlkIter(pBlock, &blkIter);
while ((row = tsdbGetSubmitBlkNext(&blkIter)) != NULL) {
if (tsdbCopyRowToMem(pRepo, row, pTable, &(rows[rowCounter])) < 0) {
@@ -632,9 +626,18 @@ static int tsdbInsertDataToTable(STsdbRepo *pRepo, SSubmitBlk *pBlock, int32_t *
if (rows[rowCounter] != NULL) {
rowCounter++;
}
+
+ if (rowCounter == TSDB_MAX_INSERT_BATCH) {
+ if (tsdbInsertDataToTableImpl(pRepo, pTable, rows, rowCounter) < 0) {
+ goto _err;
+ }
+
+ rowCounter = 0;
+ memset(rows, 0, sizeof(rows));
+ }
}
- if (tsdbInsertDataToTableImpl(pRepo, pTable, rows, rowCounter) < 0) {
+ if (rowCounter > 0 && tsdbInsertDataToTableImpl(pRepo, pTable, rows, rowCounter) < 0) {
goto _err;
}
@@ -642,11 +645,9 @@ static int tsdbInsertDataToTable(STsdbRepo *pRepo, SSubmitBlk *pBlock, int32_t *
pRepo->stat.pointsWritten += points * schemaNCols(pSchema);
pRepo->stat.totalStorage += points * schemaVLen(pSchema);
- free(rows);
return 0;
_err:
- free(rows);
return -1;
}
@@ -663,9 +664,10 @@ static int tsdbCopyRowToMem(STsdbRepo *pRepo, SDataRow row, STable *pTable, void
return -1;
}
- if (key > TABLE_LASTKEY(pTable)) {
+ TSKEY lastKey = tsdbGetTableLastKeyImpl(pTable);
+ if (key > lastKey) {
tsdbTrace("vgId:%d skip to delete row key %" PRId64 " which is larger than table lastKey %" PRId64,
- REPO_ID(pRepo), key, TABLE_LASTKEY(pTable));
+ REPO_ID(pRepo), key, lastKey);
return 0;
}
}
@@ -846,8 +848,10 @@ static int tsdbInsertDataToTableImpl(STsdbRepo *pRepo, STable *pTable, void **ro
if (pTableData->keyLast < dataRowKey(rows[rowCounter - 1])) pTableData->keyLast = dataRowKey(rows[rowCounter - 1]);
pTableData->numOfRows += dsize;
- // TODO: impl delete row thing
- if (TABLE_LASTKEY(pTable) < dataRowKey(rows[rowCounter-1])) TABLE_LASTKEY(pTable) = dataRowKey(rows[rowCounter-1]);
+ // update table latest info
+ if (tsdbUpdateTableLatestInfo(pRepo, pTable, rows[rowCounter - 1]) < 0) {
+ return -1;
+ }
return 0;
}
@@ -889,4 +893,38 @@ static void tsdbFreeRows(STsdbRepo *pRepo, void **rows, int rowCounter) {
}
}
}
+}
+
+static int tsdbUpdateTableLatestInfo(STsdbRepo *pRepo, STable *pTable, SDataRow row) {
+ STsdbCfg *pCfg = &pRepo->config;
+
+ if (tsdbGetTableLastKeyImpl(pTable) < dataRowKey(row)) {
+ if (pCfg->cacheLastRow || pTable->lastRow != NULL) {
+ SDataRow nrow = pTable->lastRow;
+ if (taosTSizeof(nrow) < dataRowLen(row)) {
+ SDataRow orow = nrow;
+ nrow = taosTMalloc(dataRowLen(row));
+ if (nrow == NULL) {
+ terrno = TSDB_CODE_TDB_OUT_OF_MEMORY;
+ return -1;
+ }
+
+ dataRowCpy(nrow, row);
+ TSDB_WLOCK_TABLE(pTable);
+ pTable->lastKey = dataRowKey(row);
+ pTable->lastRow = nrow;
+ TSDB_WUNLOCK_TABLE(pTable);
+ taosTZfree(orow);
+ } else {
+ TSDB_WLOCK_TABLE(pTable);
+ pTable->lastKey = dataRowKey(row);
+ dataRowCpy(nrow, row);
+ TSDB_WUNLOCK_TABLE(pTable);
+ }
+ } else {
+ pTable->lastKey = dataRowKey(row);
+ }
+ }
+
+ return 0;
}
\ No newline at end of file
diff --git a/src/tsdb/src/tsdbMeta.c b/src/tsdb/src/tsdbMeta.c
index 9dfa147c8f..7b08178f49 100644
--- a/src/tsdb/src/tsdbMeta.c
+++ b/src/tsdb/src/tsdbMeta.c
@@ -377,11 +377,11 @@ int tsdbUpdateTableTagValue(TSDB_REPO_T *repo, SUpdateTableTagValMsg *pMsg) {
// Chage in memory
if (pNewSchema != NULL) { // change super table tag schema
- taosWLockLatch(&(pTable->pSuper->latch));
+ TSDB_WLOCK_TABLE(pTable->pSuper);
STSchema *pOldSchema = pTable->pSuper->tagSchema;
pTable->pSuper->tagSchema = pNewSchema;
tdFreeSchema(pOldSchema);
- taosWUnLockLatch(&(pTable->pSuper->latch));
+ TSDB_WUNLOCK_TABLE(pTable->pSuper);
}
bool isChangeIndexCol = (pMsg->colId == colColId(schemaColAt(pTable->pSuper->tagSchema, 0)));
@@ -392,9 +392,9 @@ int tsdbUpdateTableTagValue(TSDB_REPO_T *repo, SUpdateTableTagValMsg *pMsg) {
tsdbWLockRepoMeta(pRepo);
tsdbRemoveTableFromIndex(pMeta, pTable);
}
- taosWLockLatch(&(pTable->latch));
+ TSDB_WLOCK_TABLE(pTable);
tdSetKVRowDataOfCol(&(pTable->tagVal), pMsg->colId, pMsg->type, POINTER_SHIFT(pMsg->data, pMsg->schemaLen));
- taosWUnLockLatch(&(pTable->latch));
+ TSDB_WUNLOCK_TABLE(pTable);
if (isChangeIndexCol) {
tsdbAddTableIntoIndex(pMeta, pTable, false);
tsdbUnlockRepoMeta(pRepo);
@@ -587,7 +587,7 @@ void tsdbUpdateTableSchema(STsdbRepo *pRepo, STable *pTable, STSchema *pSchema,
STable *pCTable = (TABLE_TYPE(pTable) == TSDB_CHILD_TABLE) ? pTable->pSuper : pTable;
ASSERT(schemaVersion(pSchema) > schemaVersion(pCTable->schema[pCTable->numOfSchemas - 1]));
- taosWLockLatch(&(pCTable->latch));
+ TSDB_WLOCK_TABLE(pCTable);
if (pCTable->numOfSchemas < TSDB_MAX_TABLE_SCHEMAS) {
pCTable->schema[pCTable->numOfSchemas++] = pSchema;
} else {
@@ -599,7 +599,7 @@ void tsdbUpdateTableSchema(STsdbRepo *pRepo, STable *pTable, STSchema *pSchema,
if (schemaNCols(pSchema) > pMeta->maxCols) pMeta->maxCols = schemaNCols(pSchema);
if (schemaTLen(pSchema) > pMeta->maxRowBytes) pMeta->maxRowBytes = schemaTLen(pSchema);
- taosWUnLockLatch(&(pCTable->latch));
+ TSDB_WUNLOCK_TABLE(pCTable);
if (insertAct) {
int tlen = tsdbGetTableEncodeSize(TSDB_UPDATE_META, pCTable);
@@ -775,6 +775,7 @@ static void tsdbFreeTable(STable *pTable) {
kvRowFree(pTable->tagVal);
tSkipListDestroy(pTable->pIndex);
+ taosTZfree(pTable->lastRow);
tfree(pTable->sql);
free(pTable);
}
diff --git a/src/tsdb/src/tsdbRead.c b/src/tsdb/src/tsdbRead.c
index d5cc566b55..7e2e135c4b 100644
--- a/src/tsdb/src/tsdbRead.c
+++ b/src/tsdb/src/tsdbRead.c
@@ -110,6 +110,7 @@ typedef struct STsdbQueryHandle {
SArray* pTableCheckInfo; // SArray
int32_t activeIndex;
bool checkFiles; // check file stage
+ bool cachelastrow; // check if last row cached
void* qinfo; // query info handle, for debug purpose
int32_t type; // query type: retrieve all data blocks, 2. retrieve only last row, 3. retrieve direct prev|next rows
SFileGroup* pFileGroup;
@@ -133,7 +134,9 @@ typedef struct STableGroupSupporter {
STSchema* pTagSchema;
} STableGroupSupporter;
-static STimeWindow changeTableGroupByLastrow(STableGroupInfo *groupList);
+static STimeWindow updateLastrowForEachGroup(STableGroupInfo *groupList);
+static int32_t checkForCachedLastRow(STsdbQueryHandle* pQueryHandle, STableGroupInfo *groupList);
+static int32_t tsdbGetCachedLastRow(STable* pTable, SDataRow* pRes, TSKEY* lastKey);
static void changeQueryHandleForInterpQuery(TsdbQueryHandleT pHandle);
static void doMergeTwoLevelData(STsdbQueryHandle* pQueryHandle, STableCheckInfo* pCheckInfo, SCompBlock* pBlock);
@@ -370,7 +373,7 @@ TsdbQueryHandleT* tsdbQueryTables(TSDB_REPO_T* tsdb, STsdbQueryCond* pCond, STab
}
TsdbQueryHandleT tsdbQueryLastRow(TSDB_REPO_T *tsdb, STsdbQueryCond *pCond, STableGroupInfo *groupList, void* qinfo, SMemRef* pMemRef) {
- pCond->twindow = changeTableGroupByLastrow(groupList);
+ pCond->twindow = updateLastrowForEachGroup(groupList);
// no qualified table
if (groupList->numOfTables == 0) {
@@ -378,8 +381,14 @@ TsdbQueryHandleT tsdbQueryLastRow(TSDB_REPO_T *tsdb, STsdbQueryCond *pCond, STab
}
STsdbQueryHandle *pQueryHandle = (STsdbQueryHandle*) tsdbQueryTables(tsdb, pCond, groupList, qinfo, pMemRef);
+ int32_t code = checkForCachedLastRow(pQueryHandle, groupList);
+ if (code != TSDB_CODE_SUCCESS) { // set the numOfTables to be 0
+ terrno = code;
+ return NULL;
+ }
assert(pCond->order == TSDB_ORDER_ASC && pCond->twindow.skey <= pCond->twindow.ekey);
+ pQueryHandle->type = TSDB_QUERY_TYPE_LAST;
return pQueryHandle;
}
@@ -956,9 +965,9 @@ static int32_t loadFileDataBlock(STsdbQueryHandle* pQueryHandle, SCompBlock* pBl
return code;
}
- SDataCols* pTSCol = pQueryHandle->rhelper.pDataCols[0];
+ SDataCols* pTsCol = pQueryHandle->rhelper.pDataCols[0];
if (pCheckInfo->lastKey < pBlock->keyLast) {
- cur->pos = binarySearchForKey(pTSCol->cols[0].pData, pBlock->numOfRows, pCheckInfo->lastKey, pQueryHandle->order);
+ cur->pos = binarySearchForKey(pTsCol->cols[0].pData, pBlock->numOfRows, pCheckInfo->lastKey, pQueryHandle->order);
} else {
cur->pos = pBlock->numOfRows - 1;
}
@@ -1704,7 +1713,32 @@ static int32_t createDataBlocksInfo(STsdbQueryHandle* pQueryHandle, int32_t numO
return TSDB_CODE_SUCCESS;
}
-static int32_t getDataBlocksInFilesImpl(STsdbQueryHandle* pQueryHandle, bool* exists) {
+static int32_t getFirstFileDataBlock(STsdbQueryHandle* pQueryHandle, bool* exists);
+
+static int32_t getDataBlockRv(STsdbQueryHandle* pQueryHandle, STableBlockInfo* pNext, bool *exists) {
+ int32_t step = ASCENDING_TRAVERSE(pQueryHandle->order)? 1 : -1;
+ SQueryFilePos* cur = &pQueryHandle->cur;
+
+ while(1) {
+ int32_t code = loadFileDataBlock(pQueryHandle, pNext->compBlock, pNext->pTableCheckInfo, exists);
+ if (code != TSDB_CODE_SUCCESS || *exists) {
+ return code;
+ }
+
+ if ((cur->slot == pQueryHandle->numOfBlocks - 1 && ASCENDING_TRAVERSE(pQueryHandle->order)) ||
+ (cur->slot == 0 && !ASCENDING_TRAVERSE(pQueryHandle->order))) {
+ // all data blocks in current file has been checked already, try next file if exists
+ return getFirstFileDataBlock(pQueryHandle, exists);
+ } else { // next block of the same file
+ cur->slot += step;
+ cur->mixBlock = false;
+ cur->blockCompleted = false;
+ pNext = &pQueryHandle->pDataBlockInfo[cur->slot];
+ }
+ }
+}
+
+static int32_t getFirstFileDataBlock(STsdbQueryHandle* pQueryHandle, bool* exists) {
pQueryHandle->numOfBlocks = 0;
SQueryFilePos* cur = &pQueryHandle->cur;
@@ -1789,7 +1823,23 @@ static int32_t getDataBlocksInFilesImpl(STsdbQueryHandle* pQueryHandle, bool* ex
cur->fid = pQueryHandle->pFileGroup->fileId;
STableBlockInfo* pBlockInfo = &pQueryHandle->pDataBlockInfo[cur->slot];
- return loadFileDataBlock(pQueryHandle, pBlockInfo->compBlock, pBlockInfo->pTableCheckInfo, exists);
+ return getDataBlockRv(pQueryHandle, pBlockInfo, exists);
+}
+
+static bool isEndFileDataBlock(SQueryFilePos* cur, int32_t numOfBlocks, bool ascTrav) {
+ assert(cur != NULL && numOfBlocks > 0);
+ return (cur->slot == numOfBlocks - 1 && ascTrav) || (cur->slot == 0 && !ascTrav);
+}
+
+static void moveToNextDataBlockInCurrentFile(STsdbQueryHandle* pQueryHandle) {
+ int32_t step = ASCENDING_TRAVERSE(pQueryHandle->order)? 1 : -1;
+
+ SQueryFilePos* cur = &pQueryHandle->cur;
+ assert(cur->slot < pQueryHandle->numOfBlocks && cur->slot >= 0);
+
+ cur->slot += step;
+ cur->mixBlock = false;
+ cur->blockCompleted = false;
}
static int32_t getDataBlocksInFiles(STsdbQueryHandle* pQueryHandle, bool* exists) {
@@ -1800,14 +1850,14 @@ static int32_t getDataBlocksInFiles(STsdbQueryHandle* pQueryHandle, bool* exists
if (!pQueryHandle->locateStart) {
pQueryHandle->locateStart = true;
STsdbCfg* pCfg = &pQueryHandle->pTsdb->config;
- int32_t fid = getFileIdFromKey(pQueryHandle->window.skey, pCfg->daysPerFile, pCfg->precision);
+ int32_t fid = getFileIdFromKey(pQueryHandle->window.skey, pCfg->daysPerFile, pCfg->precision);
pthread_rwlock_rdlock(&pQueryHandle->pTsdb->tsdbFileH->fhlock);
tsdbInitFileGroupIter(pFileHandle, &pQueryHandle->fileIter, pQueryHandle->order);
tsdbSeekFileGroupIter(&pQueryHandle->fileIter, fid);
pthread_rwlock_unlock(&pQueryHandle->pTsdb->tsdbFileH->fhlock);
- return getDataBlocksInFilesImpl(pQueryHandle, exists);
+ return getFirstFileDataBlock(pQueryHandle, exists);
} else {
// check if current file block is all consumed
STableBlockInfo* pBlockInfo = &pQueryHandle->pDataBlockInfo[cur->slot];
@@ -1815,27 +1865,26 @@ static int32_t getDataBlocksInFiles(STsdbQueryHandle* pQueryHandle, bool* exists
// current block is done, try next
if ((!cur->mixBlock) || cur->blockCompleted) {
- if ((cur->slot == pQueryHandle->numOfBlocks - 1 && ASCENDING_TRAVERSE(pQueryHandle->order)) ||
- (cur->slot == 0 && !ASCENDING_TRAVERSE(pQueryHandle->order))) {
- // all data blocks in current file has been checked already, try next file if exists
- return getDataBlocksInFilesImpl(pQueryHandle, exists);
- } else {
- // next block of the same file
- int32_t step = ASCENDING_TRAVERSE(pQueryHandle->order) ? 1 : -1;
- cur->slot += step;
-
- cur->mixBlock = false;
- cur->blockCompleted = false;
-
- STableBlockInfo* pNext = &pQueryHandle->pDataBlockInfo[cur->slot];
- return loadFileDataBlock(pQueryHandle, pNext->compBlock, pNext->pTableCheckInfo, exists);
- }
+ // all data blocks in current file has been checked already, try next file if exists
} else {
- tsdbDebug("%p continue in current data block, index:%d, pos:%d, %p", pQueryHandle, cur->slot, cur->pos, pQueryHandle->qinfo);
+ tsdbDebug("%p continue in current data block, index:%d, pos:%d, %p", pQueryHandle, cur->slot, cur->pos,
+ pQueryHandle->qinfo);
int32_t code = handleDataMergeIfNeeded(pQueryHandle, pBlockInfo->compBlock, pCheckInfo);
- *exists = pQueryHandle->realNumOfRows > 0;
+ *exists = (pQueryHandle->realNumOfRows > 0);
- return code;
+ if (code != TSDB_CODE_SUCCESS || *exists) {
+ return code;
+ }
+ }
+
+ // current block is empty, try next block in file
+ // all data blocks in current file has been checked already, try next file if exists
+ if (isEndFileDataBlock(cur, pQueryHandle->numOfBlocks, ASCENDING_TRAVERSE(pQueryHandle->order))) {
+ return getFirstFileDataBlock(pQueryHandle, exists);
+ } else {
+ moveToNextDataBlockInCurrentFile(pQueryHandle);
+ STableBlockInfo* pNext = &pQueryHandle->pDataBlockInfo[cur->slot];
+ return getDataBlockRv(pQueryHandle, pNext, exists);
}
}
}
@@ -2104,6 +2153,39 @@ bool tsdbNextDataBlock(TsdbQueryHandleT* pHandle) {
// restore the pMemRef
pQueryHandle->pMemRef = pMemRef;
return ret;
+ } else if (pQueryHandle->type == TSDB_QUERY_TYPE_LAST && pQueryHandle->cachelastrow) {
+ // the last row is cached in buffer, return it directly.
+ // here note that the pQueryHandle->window must be the TS_INITIALIZER
+ int32_t numOfCols = (int32_t)(QH_GET_NUM_OF_COLS(pQueryHandle));
+ SQueryFilePos* cur = &pQueryHandle->cur;
+
+ SDataRow pRow = NULL;
+ TSKEY key = TSKEY_INITIAL_VAL;
+ int32_t step = ASCENDING_TRAVERSE(pQueryHandle->order)? 1:-1;
+
+ if (++pQueryHandle->activeIndex < numOfTables) {
+ STableCheckInfo* pCheckInfo = taosArrayGet(pQueryHandle->pTableCheckInfo, pQueryHandle->activeIndex);
+ int32_t ret = tsdbGetCachedLastRow(pCheckInfo->pTableObj, &pRow, &key);
+ if (ret != TSDB_CODE_SUCCESS) {
+ return false;
+ }
+
+ copyOneRowFromMem(pQueryHandle, pQueryHandle->outputCapacity, 0, pRow, numOfCols, pCheckInfo->pTableObj);
+ tfree(pRow);
+
+ // update the last key value
+ pCheckInfo->lastKey = key + step;
+
+ cur->rows = 1; // only one row
+ cur->lastKey = key + step;
+ cur->mixBlock = true;
+ cur->win.skey = key;
+ cur->win.ekey = key;
+
+ return true;
+ }
+
+ return false;
}
if (pQueryHandle->checkFiles) {
@@ -2136,7 +2218,57 @@ bool tsdbNextDataBlock(TsdbQueryHandleT* pHandle) {
return ret;
}
-STimeWindow changeTableGroupByLastrow(STableGroupInfo *groupList) {
+/*
+ * 1. no data at all (pTable->lastKey = TSKEY_INITIAL_VAL), just return TSKEY_INITIAL_VAL
+ * 2. has data but not loaded, just return lastKey but not set pRes
+ * 3. has data and loaded, return lastKey and set pRes
+ */
+int32_t tsdbGetCachedLastRow(STable* pTable, SDataRow* pRes, TSKEY* lastKey) {
+ TSDB_RLOCK_TABLE(pTable);
+ *lastKey = pTable->lastKey;
+
+ if ((*lastKey) != TSKEY_INITIAL_VAL && pTable->lastRow) {
+ *pRes = tdDataRowDup(pTable->lastRow);
+ if (*pRes == NULL) {
+ TSDB_RUNLOCK_TABLE(pTable);
+ return TSDB_CODE_TDB_OUT_OF_MEMORY;
+ }
+ }
+
+ TSDB_RUNLOCK_TABLE(pTable);
+ return TSDB_CODE_SUCCESS;
+}
+
+int32_t checkForCachedLastRow(STsdbQueryHandle* pQueryHandle, STableGroupInfo *groupList) {
+ assert(pQueryHandle != NULL && groupList != NULL);
+
+ SDataRow pRow = NULL;
+ TSKEY key = TSKEY_INITIAL_VAL;
+
+ SArray* group = taosArrayGetP(groupList->pGroupList, 0);
+ assert(group != NULL);
+
+ STableKeyInfo* pInfo = (STableKeyInfo*)taosArrayGet(group, 0);
+
+ int32_t code = tsdbGetCachedLastRow(pInfo->pTable, &pRow, &key);
+ if (code != TSDB_CODE_SUCCESS) {
+ pQueryHandle->cachelastrow = false;
+ } else {
+ pQueryHandle->cachelastrow = (pRow != NULL);
+ }
+
+ // update the tsdb query time range
+ if (pQueryHandle->cachelastrow) {
+ pQueryHandle->window = TSWINDOW_INITIALIZER;
+ pQueryHandle->checkFiles = false;
+ pQueryHandle->activeIndex = -1; // start from -1
+ }
+
+ tfree(pRow);
+ return code;
+}
+
+STimeWindow updateLastrowForEachGroup(STableGroupInfo *groupList) {
STimeWindow window = {INT64_MAX, INT64_MIN};
int32_t totalNumOfTable = 0;
@@ -2151,16 +2283,16 @@ STimeWindow changeTableGroupByLastrow(STableGroupInfo *groupList) {
size_t numOfTables = taosArrayGetSize(pGroup);
for(int32_t i = 0; i < numOfTables; ++i) {
- STableKeyInfo* pKeyInfo = (STableKeyInfo*) taosArrayGet(pGroup, i);
+ STableKeyInfo* pInfo = (STableKeyInfo*) taosArrayGet(pGroup, i);
// if the lastKey equals to INT64_MIN, there is no data in this table
- TSKEY lastKey = ((STable*)(pKeyInfo->pTable))->lastKey;
+ TSKEY lastKey = ((STable*)(pInfo->pTable))->lastKey;
if (key < lastKey) {
key = lastKey;
- keyInfo.pTable = pKeyInfo->pTable;
+ keyInfo.pTable = pInfo->pTable;
keyInfo.lastKey = key;
- pKeyInfo->lastKey = key;
+ pInfo->lastKey = key;
if (key < window.skey) {
window.skey = key;
@@ -2174,11 +2306,11 @@ STimeWindow changeTableGroupByLastrow(STableGroupInfo *groupList) {
// clear current group, unref unused table
for (int32_t i = 0; i < numOfTables; ++i) {
- STableKeyInfo* pKeyInfo = (STableKeyInfo*)taosArrayGet(pGroup, i);
+ STableKeyInfo* pInfo = (STableKeyInfo*)taosArrayGet(pGroup, i);
// keyInfo.pTable may be NULL here.
- if (pKeyInfo->pTable != keyInfo.pTable) {
- tsdbUnRefTable(pKeyInfo->pTable);
+ if (pInfo->pTable != keyInfo.pTable) {
+ tsdbUnRefTable(pInfo->pTable);
}
}
diff --git a/src/util/inc/buildInfo.h b/src/util/inc/buildInfo.h
deleted file mode 100644
index 8d169d618d..0000000000
--- a/src/util/inc/buildInfo.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#ifndef _TS_BUILD_H_
-#define _TS_BUILD_H_
-
-extern const char tsVersion[];
-extern const char tsBuildInfo[];
-
-#endif
diff --git a/src/util/inc/hash.h b/src/util/inc/hash.h
index 5bada93d1c..7ec4e5445a 100644
--- a/src/util/inc/hash.h
+++ b/src/util/inc/hash.h
@@ -32,17 +32,18 @@ typedef void (*_hash_free_fn_t)(void *param);
typedef struct SHashNode {
struct SHashNode *next;
- uint32_t hashVal; // the hash value of key
- uint32_t keyLen; // length of the key
- size_t dataLen; // length of data
- int8_t count; // reference count
- int8_t removed; // flag to indicate removed
+ uint32_t hashVal; // the hash value of key
+ uint32_t dataLen; // length of data
+ uint32_t keyLen; // length of the key
+ int8_t removed; // flag to indicate removed
+ int8_t count; // reference count
char data[];
} SHashNode;
#define GET_HASH_NODE_KEY(_n) ((char*)(_n) + sizeof(SHashNode) + (_n)->dataLen)
#define GET_HASH_NODE_DATA(_n) ((char*)(_n) + sizeof(SHashNode))
#define GET_HASH_PNODE(_n) ((char*)(_n) - sizeof(SHashNode));
+
typedef enum SHashLockTypeE {
HASH_NO_LOCK = 0,
HASH_ENTRY_LOCK = 1,
@@ -115,7 +116,7 @@ void *taosHashGet(SHashObj *pHashObj, const void *key, size_t keyLen);
* @param dsize
* @return
*/
-void* taosHashGetCB(SHashObj *pHashObj, const void *key, size_t keyLen, void (*fp)(void *), void* d, size_t dsize);
+void* taosHashGetClone(SHashObj *pHashObj, const void *key, size_t keyLen, void (*fp)(void *), void* d, size_t dsize);
/**
* remove item with the specified key
diff --git a/src/util/inc/tconfig.h b/src/util/inc/tconfig.h
index 665528f140..bc1da9858a 100644
--- a/src/util/inc/tconfig.h
+++ b/src/util/inc/tconfig.h
@@ -41,6 +41,7 @@ enum {
};
enum {
+ TAOS_CFG_VTYPE_INT8,
TAOS_CFG_VTYPE_INT16,
TAOS_CFG_VTYPE_INT32,
TAOS_CFG_VTYPE_FLOAT,
diff --git a/src/util/src/hash.c b/src/util/src/hash.c
index 7a835e87e7..2af25a7b3a 100644
--- a/src/util/src/hash.c
+++ b/src/util/src/hash.c
@@ -271,10 +271,10 @@ int32_t taosHashPut(SHashObj *pHashObj, const void *key, size_t keyLen, void *da
}
void *taosHashGet(SHashObj *pHashObj, const void *key, size_t keyLen) {
- return taosHashGetCB(pHashObj, key, keyLen, NULL, NULL, 0);
+ return taosHashGetClone(pHashObj, key, keyLen, NULL, NULL, 0);
}
-void* taosHashGetCB(SHashObj *pHashObj, const void *key, size_t keyLen, void (*fp)(void *), void* d, size_t dsize) {
+void* taosHashGetClone(SHashObj *pHashObj, const void *key, size_t keyLen, void (*fp)(void *), void* d, size_t dsize) {
if (pHashObj->size <= 0 || keyLen == 0 || key == NULL) {
return NULL;
}
@@ -654,7 +654,7 @@ SHashNode *doCreateHashNode(const void *key, size_t keyLen, const void *pData, s
pNewNode->keyLen = (uint32_t)keyLen;
pNewNode->hashVal = hashVal;
- pNewNode->dataLen = dsize;
+ pNewNode->dataLen = (uint32_t) dsize;
pNewNode->count = 1;
memcpy(GET_HASH_NODE_DATA(pNewNode), pData, dsize);
diff --git a/src/util/src/tcache.c b/src/util/src/tcache.c
index 2571f11ba4..3afdf41d05 100644
--- a/src/util/src/tcache.c
+++ b/src/util/src/tcache.c
@@ -278,7 +278,7 @@ void *taosCacheAcquireByKey(SCacheObj *pCacheObj, const void *key, size_t keyLen
}
SCacheDataNode* ptNode = NULL;
- taosHashGetCB(pCacheObj->pHashTable, key, keyLen, incRefFn, &ptNode, sizeof(void*));
+ taosHashGetClone(pCacheObj->pHashTable, key, keyLen, incRefFn, &ptNode, sizeof(void*));
void* pData = (ptNode != NULL)? ptNode->data:NULL;
@@ -547,13 +547,14 @@ void taosAddToTrashcan(SCacheObj *pCacheObj, SCacheDataNode *pNode) {
return;
}
+ __cache_wr_lock(pCacheObj);
STrashElem *pElem = calloc(1, sizeof(STrashElem));
pElem->pData = pNode;
- pElem->prev = NULL;
+ pElem->prev = NULL;
+ pElem->next = NULL;
pNode->inTrashcan = true;
pNode->pTNodeHeader = pElem;
- __cache_wr_lock(pCacheObj);
pElem->next = pCacheObj->pTrash;
if (pCacheObj->pTrash) {
pCacheObj->pTrash->prev = pElem;
@@ -563,8 +564,8 @@ void taosAddToTrashcan(SCacheObj *pCacheObj, SCacheDataNode *pNode) {
pCacheObj->numOfElemsInTrash++;
__cache_unlock(pCacheObj);
- uDebug("cache:%s key:%p, %p move to trashcan, pTrashElem:%p, numOfElem in trashcan:%d", pCacheObj->name,
- pNode->key, pNode->data, pElem, pCacheObj->numOfElemsInTrash);
+ uDebug("cache:%s key:%p, %p move to trashcan, pTrashElem:%p, numOfElem in trashcan:%d", pCacheObj->name, pNode->key,
+ pNode->data, pElem, pCacheObj->numOfElemsInTrash);
}
void taosTrashcanEmpty(SCacheObj *pCacheObj, bool force) {
diff --git a/src/util/src/tconfig.c b/src/util/src/tconfig.c
index 1d2bd6252f..0a9f5a98c0 100644
--- a/src/util/src/tconfig.c
+++ b/src/util/src/tconfig.c
@@ -95,6 +95,23 @@ static void taosReadInt16Config(SGlobalCfg *cfg, char *input_value) {
}
}
+static void taosReadInt8Config(SGlobalCfg *cfg, char *input_value) {
+ int32_t value = atoi(input_value);
+ int8_t *option = (int8_t *)cfg->ptr;
+ if (value < cfg->minValue || value > cfg->maxValue) {
+ uError("config option:%s, input value:%s, out of range[%f, %f], use default value:%d",
+ cfg->option, input_value, cfg->minValue, cfg->maxValue, *option);
+ } else {
+ if (cfg->cfgStatus <= TAOS_CFG_CSTATUS_FILE) {
+ *option = (int8_t)value;
+ cfg->cfgStatus = TAOS_CFG_CSTATUS_FILE;
+ } else {
+ uWarn("config option:%s, input value:%s, is configured by %s, use %d", cfg->option, input_value,
+ tsCfgStatusStr[cfg->cfgStatus], *option);
+ }
+ }
+}
+
static void taosReadDirectoryConfig(SGlobalCfg *cfg, char *input_value) {
int length = (int)strlen(input_value);
char *option = (char *)cfg->ptr;
@@ -204,6 +221,9 @@ static void taosReadConfigOption(const char *option, char *value) {
if (strcasecmp(cfg->option, option) != 0) continue;
switch (cfg->valType) {
+ case TAOS_CFG_VTYPE_INT8:
+ taosReadInt8Config(cfg, value);
+ break;
case TAOS_CFG_VTYPE_INT16:
taosReadInt16Config(cfg, value);
break;
@@ -376,6 +396,9 @@ void taosPrintGlobalCfg() {
blank[blankLen] = 0;
switch (cfg->valType) {
+ case TAOS_CFG_VTYPE_INT8:
+ uInfo(" %s:%s%d%s", cfg->option, blank, *((int8_t *)cfg->ptr), tsGlobalUnit[cfg->unitType]);
+ break;
case TAOS_CFG_VTYPE_INT16:
uInfo(" %s:%s%d%s", cfg->option, blank, *((int16_t *)cfg->ptr), tsGlobalUnit[cfg->unitType]);
break;
@@ -408,6 +431,9 @@ static void taosDumpCfg(SGlobalCfg *cfg) {
blank[blankLen] = 0;
switch (cfg->valType) {
+ case TAOS_CFG_VTYPE_INT8:
+ printf(" %s:%s%d%s\n", cfg->option, blank, *((int8_t *)cfg->ptr), tsGlobalUnit[cfg->unitType]);
+ break;
case TAOS_CFG_VTYPE_INT16:
printf(" %s:%s%d%s\n", cfg->option, blank, *((int16_t *)cfg->ptr), tsGlobalUnit[cfg->unitType]);
break;
diff --git a/src/util/src/tlog.c b/src/util/src/tlog.c
index c0f89e8465..fa6a9db8ec 100644
--- a/src/util/src/tlog.c
+++ b/src/util/src/tlog.c
@@ -64,10 +64,10 @@ typedef struct {
} SLogObj;
int32_t tsLogKeepDays = 0;
-int32_t tsAsyncLog = 1;
+int8_t tsAsyncLog = 1;
float tsTotalLogDirGB = 0;
float tsAvailLogDirGB = 0;
-float tsMinimalLogDirGB = 0.1f;
+float tsMinimalLogDirGB = 1.0f;
#ifdef _TD_POWER_
char tsLogDir[TSDB_FILENAME_LEN] = "/var/log/power";
#else
diff --git a/src/util/src/tskiplist.c b/src/util/src/tskiplist.c
index 7c950b7999..e3798162e8 100644
--- a/src/util/src/tskiplist.c
+++ b/src/util/src/tskiplist.c
@@ -280,10 +280,13 @@ bool tSkipListIterNext(SSkipListIterator *iter) {
tSkipListRLock(pSkipList);
if (iter->order == TSDB_ORDER_ASC) {
- if (iter->cur == pSkipList->pTail) {
+ // no data in the skip list
+ if (iter->cur == pSkipList->pTail || iter->next == NULL) {
+ iter->cur = pSkipList->pTail;
tSkipListUnlock(pSkipList);
return false;
}
+
iter->cur = SL_NODE_GET_FORWARD_POINTER(iter->cur, 0);
// a new node is inserted into between iter->cur and iter->next, ignore it
@@ -295,9 +298,11 @@ bool tSkipListIterNext(SSkipListIterator *iter) {
iter->step++;
} else {
if (iter->cur == pSkipList->pHead) {
+ iter->cur = pSkipList->pHead;
tSkipListUnlock(pSkipList);
return false;
}
+
iter->cur = SL_NODE_GET_BACKWARD_POINTER(iter->cur, 0);
// a new node is inserted into between iter->cur and iter->next, ignore it
diff --git a/src/util/src/tsocket.c b/src/util/src/tsocket.c
index 46068e8992..1a5c3bd64d 100644
--- a/src/util/src/tsocket.c
+++ b/src/util/src/tsocket.c
@@ -18,6 +18,10 @@
#include "tsocket.h"
#include "taoserror.h"
+#ifndef SIGPIPE
+ #define SIGPIPE EPIPE
+#endif
+
int32_t taosGetFqdn(char *fqdn) {
char hostname[1024];
hostname[1023] = '\0';
@@ -115,6 +119,10 @@ int32_t taosWriteMsg(SOCKET fd, void *buf, int32_t nbytes) {
nleft -= nwritten;
ptr += nwritten;
}
+
+ if (errno == SIGPIPE || errno == EPIPE) {
+ return -1;
+ }
}
return (nbytes - nleft);
@@ -142,6 +150,10 @@ int32_t taosReadMsg(SOCKET fd, void *buf, int32_t nbytes) {
nleft -= nread;
ptr += nread;
}
+
+ if (errno == SIGPIPE || errno == EPIPE) {
+ return -1;
+ }
}
return (nbytes - nleft);
diff --git a/src/util/src/ttimer.c b/src/util/src/ttimer.c
index 114f0764e8..3c0462e980 100644
--- a/src/util/src/ttimer.c
+++ b/src/util/src/ttimer.c
@@ -19,7 +19,7 @@
#include "ttimer.h"
#include "tutil.h"
-extern uint32_t tscEmbedded;
+extern int8_t tscEmbedded;
#define tmrFatal(...) { if (tmrDebugFlag & DEBUG_FATAL) { taosPrintLog("TMR FATAL ", tscEmbedded ? 255 : tmrDebugFlag, __VA_ARGS__); }}
#define tmrError(...) { if (tmrDebugFlag & DEBUG_ERROR) { taosPrintLog("TMR ERROR ", tscEmbedded ? 255 : tmrDebugFlag, __VA_ARGS__); }}
diff --git a/src/vnode/src/vnodeCfg.c b/src/vnode/src/vnodeCfg.c
index aff7315d28..b47fedd46e 100644
--- a/src/vnode/src/vnodeCfg.c
+++ b/src/vnode/src/vnodeCfg.c
@@ -34,6 +34,7 @@ static void vnodeLoadCfg(SVnodeObj *pVnode, SCreateVnodeMsg* vnodeMsg) {
pVnode->tsdbCfg.maxRowsPerFileBlock = vnodeMsg->cfg.maxRowsPerFileBlock;
pVnode->tsdbCfg.precision = vnodeMsg->cfg.precision;
pVnode->tsdbCfg.compression = vnodeMsg->cfg.compression;
+ pVnode->tsdbCfg.cacheLastRow = vnodeMsg->cfg.cacheLastRow;
pVnode->walCfg.walLevel = vnodeMsg->cfg.walLevel;
pVnode->walCfg.fsyncPeriod = vnodeMsg->cfg.fsyncPeriod;
pVnode->walCfg.keep = TAOS_WAL_NOT_KEEP;
@@ -106,9 +107,10 @@ int32_t vnodeReadCfg(SVnodeObj *pVnode) {
cJSON *vgCfgVersion = cJSON_GetObjectItem(root, "vgCfgVersion");
if (!vgCfgVersion || vgCfgVersion->type != cJSON_Number) {
vError("vgId:%d, failed to read %s, vgCfgVersion not found", pVnode->vgId, file);
- goto PARSE_VCFG_ERROR;
+ vnodeMsg.cfg.vgCfgVersion = 0;
+ } else {
+ vnodeMsg.cfg.vgCfgVersion = vgCfgVersion->valueint;
}
- vnodeMsg.cfg.vgCfgVersion = vgCfgVersion->valueint;
cJSON *cacheBlockSize = cJSON_GetObjectItem(root, "cacheBlockSize");
if (!cacheBlockSize || cacheBlockSize->type != cJSON_Number) {
@@ -215,6 +217,15 @@ int32_t vnodeReadCfg(SVnodeObj *pVnode) {
}
vnodeMsg.cfg.quorum = (int8_t)quorum->valueint;
+ cJSON *cacheLastRow = cJSON_GetObjectItem(root, "cacheLastRow");
+ if (!cacheLastRow || cacheLastRow->type != cJSON_Number) {
+ vError("vgId: %d, failed to read %s, cacheLastRow not found", pVnode->vgId, file);
+ //goto PARSE_VCFG_ERROR;
+ vnodeMsg.cfg.cacheLastRow = 0;
+ } else {
+ vnodeMsg.cfg.cacheLastRow = (int8_t)cacheLastRow->valueint;
+ }
+
cJSON *nodeInfos = cJSON_GetObjectItem(root, "nodeInfos");
if (!nodeInfos || nodeInfos->type != cJSON_Array) {
vError("vgId:%d, failed to read %s, nodeInfos not found", pVnode->vgId, file);
@@ -303,6 +314,7 @@ int32_t vnodeWriteCfg(SCreateVnodeMsg *pMsg) {
len += snprintf(content + len, maxLen - len, " \"replica\": %d,\n", pMsg->cfg.replications);
len += snprintf(content + len, maxLen - len, " \"wals\": %d,\n", pMsg->cfg.wals);
len += snprintf(content + len, maxLen - len, " \"quorum\": %d,\n", pMsg->cfg.quorum);
+ len += snprintf(content + len, maxLen - len, " \"cacheLastRow\": %d,\n", pMsg->cfg.cacheLastRow);
len += snprintf(content + len, maxLen - len, " \"nodeInfos\": [{\n");
for (int32_t i = 0; i < pMsg->cfg.replications; i++) {
SVnodeDesc *node = &pMsg->nodes[i];
diff --git a/src/vnode/src/vnodeMain.c b/src/vnode/src/vnodeMain.c
index b1815e959d..8f44a248ce 100644
--- a/src/vnode/src/vnodeMain.c
+++ b/src/vnode/src/vnodeMain.c
@@ -86,6 +86,7 @@ int32_t vnodeCreate(SCreateVnodeMsg *pVnodeCfg) {
tsdbCfg.precision = pVnodeCfg->cfg.precision;
tsdbCfg.compression = pVnodeCfg->cfg.compression;
tsdbCfg.update = pVnodeCfg->cfg.update;
+ tsdbCfg.cacheLastRow = pVnodeCfg->cfg.cacheLastRow;
char tsdbDir[TSDB_FILENAME_LEN] = {0};
sprintf(tsdbDir, "%s/vnode%d/tsdb", tsVnodeDir, pVnodeCfg->cfg.vgId);
diff --git a/src/vnode/src/vnodeMgmt.c b/src/vnode/src/vnodeMgmt.c
index ee5aa5ca90..196e488210 100644
--- a/src/vnode/src/vnodeMgmt.c
+++ b/src/vnode/src/vnodeMgmt.c
@@ -89,7 +89,10 @@ static void vnodeIncRef(void *ptNode) {
}
void *vnodeAcquire(int32_t vgId) {
- SVnodeObj **ppVnode = taosHashGetCB(tsVnodesHash, &vgId, sizeof(int32_t), vnodeIncRef, NULL, sizeof(void *));
+ SVnodeObj **ppVnode = NULL;
+ if (tsVnodesHash != NULL) {
+ ppVnode = taosHashGetClone(tsVnodesHash, &vgId, sizeof(int32_t), vnodeIncRef, NULL, sizeof(void *));
+ }
if (ppVnode == NULL || *ppVnode == NULL) {
terrno = TSDB_CODE_VND_INVALID_VGROUP_ID;
diff --git a/src/vnode/src/vnodeRead.c b/src/vnode/src/vnodeRead.c
index 94fbe5066b..a972ffec1c 100644
--- a/src/vnode/src/vnodeRead.c
+++ b/src/vnode/src/vnodeRead.c
@@ -65,13 +65,17 @@ static int32_t vnodeCheckRead(SVnodeObj *pVnode) {
return TSDB_CODE_APP_NOT_READY;
}
- if (pVnode->role != TAOS_SYNC_ROLE_SLAVE && pVnode->role != TAOS_SYNC_ROLE_MASTER) {
- vDebug("vgId:%d, replica:%d role:%s, refCount:%d pVnode:%p", pVnode->vgId, pVnode->syncCfg.replica,
- syncRole[pVnode->role], pVnode->refCount, pVnode);
- return TSDB_CODE_APP_NOT_READY;
+ if (pVnode->role == TAOS_SYNC_ROLE_MASTER) {
+ return TSDB_CODE_SUCCESS;
}
- return TSDB_CODE_SUCCESS;
+ if (tsEnableSlaveQuery && pVnode->role == TAOS_SYNC_ROLE_SLAVE) {
+ return TSDB_CODE_SUCCESS;
+ }
+
+ vDebug("vgId:%d, replica:%d role:%s, refCount:%d pVnode:%p, cant provide query service", pVnode->vgId, pVnode->syncCfg.replica,
+ syncRole[pVnode->role], pVnode->refCount, pVnode);
+ return TSDB_CODE_APP_NOT_READY;
}
void vnodeFreeFromRQueue(void *vparam, SVReadMsg *pRead) {
diff --git a/src/vnode/src/vnodeWrite.c b/src/vnode/src/vnodeWrite.c
index 80e2dc422e..7cbe73fd45 100644
--- a/src/vnode/src/vnodeWrite.c
+++ b/src/vnode/src/vnodeWrite.c
@@ -297,7 +297,7 @@ static int32_t vnodePerformFlowCtrl(SVWriteMsg *pWrite) {
if (pWrite->qtype != TAOS_QTYPE_RPC) return 0;
if (pVnode->queuedWMsg < MAX_QUEUED_MSG_NUM && pVnode->flowctrlLevel <= 0) return 0;
- if (tsFlowCtrl == 0) {
+ if (tsEnableFlowCtrl == 0) {
int32_t ms = pow(2, pVnode->flowctrlLevel + 2);
if (ms > 100) ms = 100;
vTrace("vgId:%d, msg:%p, app:%p, perform flowctrl for %d ms", pVnode->vgId, pWrite, pWrite->rpcMsg.ahandle, ms);
diff --git a/tests/Jenkinsfile b/tests/Jenkinsfile
index aae81c19f4..e7d8a0b70f 100644
--- a/tests/Jenkinsfile
+++ b/tests/Jenkinsfile
@@ -50,12 +50,7 @@ pipeline {
agent{label 'master'}
steps {
pre_test()
- catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
- sh '''
- cd ${WKC}/tests/pytest
- python3 concurrent_inquiry.py -c 1
- '''
- }
+
sh '''
cd ${WKC}/tests
./test-all.sh b1
@@ -82,7 +77,37 @@ pipeline {
./handle_crash_gen_val_log.sh
'''
}
+ sh'''
+ systemctl start taosd
+ sleep 10
+ '''
+ catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
+ sh '''
+ cd ${WKC}/tests/gotest
+ bash batchtest.sh
+ '''
+ }
+ catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
+ sh '''
+ cd ${WKC}/tests/examples/python/PYTHONConnectorChecker
+ python3 PythonChecker.py
+ '''
+ }
+ catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
+ sh '''
+ cd ${WKC}/tests/examples/JDBC/JDBCDemo/
+ mvn clean package assembly:single -DskipTests >/dev/null
+ java -jar target/jdbcChecker-SNAPSHOT-jar-with-dependencies.jar -host 127.0.0.1
+ '''
+ }
+ catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
+ sh '''
+ cd ${JENKINS_HOME}/workspace/C#NET/src/CheckC#
+ dotnet run
+ '''
+ }
sh '''
+ systemctl stop taosd
cd ${WKC}/tests
./test-all.sh b2
date
@@ -95,6 +120,15 @@ pipeline {
steps {
pre_test()
+ catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
+ sh '''
+ cd ${WKC}/tests/pytest
+ nohup taosd >/dev/null &
+ sleep 10
+ python3 concurrent_inquiry.py -c 1
+
+ '''
+ }
sh '''
cd ${WKC}/tests/pytest
./valgrind-test.sh 2>&1 > mem-error-out.log
@@ -106,41 +140,7 @@ pipeline {
date'''
}
}
- stage('connector'){
- agent{label "release"}
- steps{
- sh'''
- cd ${WORKSPACE}
- git checkout develop
- '''
- catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
- sh '''
- cd ${WORKSPACE}/tests/gotest
- bash batchtest.sh
- '''
- }
- catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
- sh '''
- cd ${WORKSPACE}/tests/examples/python/PYTHONConnectorChecker
- python3 PythonChecker.py
- '''
- }
- catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
- sh '''
- cd ${WORKSPACE}/tests/examples/JDBC/JDBCDemo/
- mvn clean package assembly:single >/dev/null
- java -jar target/jdbcChecker-SNAPSHOT-jar-with-dependencies.jar -host 127.0.0.1
- '''
- }
- catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
- sh '''
- cd ${JENKINS_HOME}/workspace/C#NET/src/CheckC#
- dotnet run
- '''
- }
-
- }
- }
+
stage('arm64_build'){
agent{label 'arm64'}
steps{
diff --git a/tests/pytest/concurrent_inquiry.py b/tests/pytest/concurrent_inquiry.py
index 9a8c359e4e..7bdab8bc67 100644
--- a/tests/pytest/concurrent_inquiry.py
+++ b/tests/pytest/concurrent_inquiry.py
@@ -388,7 +388,9 @@ class ConcurrentInquiry:
print(
"Failure thread%d, sql: %s \nexception: %s" %
(threadID, str(sql),str(e)))
- #exit(-1)
+ err_uec='Unable to establish connection'
+ if err_uec in str(e) and loop >0:
+ exit(-1)
loop -= 1
if loop == 0: break
@@ -415,7 +417,9 @@ class ConcurrentInquiry:
print(
"Failure thread%d, sql: %s \nexception: %s" %
(threadID, str(sql),str(e)))
- #exit(-1)
+ err_uec='Unable to establish connection'
+ if err_uec in str(e) and loop >0:
+ exit(-1)
loop -= 1
if loop == 0: break
diff --git a/tests/pytest/crash_gen/crash_gen_main.py b/tests/pytest/crash_gen/crash_gen_main.py
index e2ce4b26fa..c6b857b097 100755
--- a/tests/pytest/crash_gen/crash_gen_main.py
+++ b/tests/pytest/crash_gen/crash_gen_main.py
@@ -2224,22 +2224,25 @@ class ClientManager:
if svcMgr: # gConfig.auto_start_service:
svcMgr.stopTaosServices()
svcMgr = None
+
+
+ # Release global variables
+ gConfig = None
+ gSvcMgr = None
+ logger = None
+
+ thPool = None
+ dbManager.cleanUp() # destructor wouldn't run in time
+ dbManager = None
+
# Print exec status, etc., AFTER showing messages from the server
self.conclude()
# print("TC failed (2) = {}".format(self.tc.isFailed()))
# Linux return code: ref https://shapeshed.com/unix-exit-codes/
ret = 1 if self.tc.isFailed() else 0
self.tc.cleanup()
-
- # Release global variables
- gConfig = None
- gSvcMgr = None
- logger = None
-
# Release variables here
self.tc = None
- thPool = None
- dbManager = None
gc.collect() # force garbage collection
# h = hpy()
diff --git a/tests/pytest/crash_gen/db.py b/tests/pytest/crash_gen/db.py
index 855e18be55..dc072d7abc 100644
--- a/tests/pytest/crash_gen/db.py
+++ b/tests/pytest/crash_gen/db.py
@@ -394,6 +394,7 @@ class DbManager():
cType == 'native') else DbConn.createRest(dbTarget)
try:
self._dbConn.open() # may throw taos.error.ProgrammingError: disconnected
+ Logging.debug("DbManager opened DB connection...")
except taos.error.ProgrammingError as err:
# print("Error type: {}, msg: {}, value: {}".format(type(err), err.msg, err))
if (err.msg == 'client disconnected'): # cannot open DB connection
@@ -412,6 +413,10 @@ class DbManager():
# Moved to Database()
# self._stateMachine = StateMechine(self._dbConn)
+ def __del__(self):
+ ''' Release the underlying DB connection upon deletion of DbManager '''
+ self.cleanUp()
+
def getDbConn(self):
return self._dbConn
@@ -438,5 +443,8 @@ class DbManager():
return "table_{}".format(tblNum)
def cleanUp(self):
- self._dbConn.close()
+ if self._dbConn:
+ self._dbConn.close()
+ self._dbConn = None
+ Logging.debug("DbManager closed DB connection...")
diff --git a/tests/pytest/crash_gen/misc.py b/tests/pytest/crash_gen/misc.py
index a374ed943b..6ea5691ce2 100644
--- a/tests/pytest/crash_gen/misc.py
+++ b/tests/pytest/crash_gen/misc.py
@@ -2,6 +2,7 @@ import threading
import random
import logging
import os
+import sys
import taos
@@ -53,7 +54,7 @@ class Logging:
# global misc.logger
_logger = logging.getLogger('CrashGen') # real logger
_logger.addFilter(LoggingFilter())
- ch = logging.StreamHandler()
+ ch = logging.StreamHandler(sys.stdout) # Ref: https://stackoverflow.com/questions/14058453/making-python-loggers-output-all-messages-to-stdout-in-addition-to-log-file
_logger.addHandler(ch)
# Logging adapter, to be used as a logger
diff --git a/tests/pytest/crash_gen_bootstrap.py b/tests/pytest/crash_gen_bootstrap.py
index fd12284b9d..de2d9b0780 100644
--- a/tests/pytest/crash_gen_bootstrap.py
+++ b/tests/pytest/crash_gen_bootstrap.py
@@ -19,5 +19,5 @@ if __name__ == "__main__":
mExec.init()
exitCode = mExec.run()
- print("Exiting with code: {}".format(exitCode))
+ print("\nCrash_Gen is now exiting with status code: {}".format(exitCode))
sys.exit(exitCode)
diff --git a/tests/pytest/handle_crash_gen_val_log.sh b/tests/pytest/handle_crash_gen_val_log.sh
index 8d131b938e..0f89ef2ec4 100755
--- a/tests/pytest/handle_crash_gen_val_log.sh
+++ b/tests/pytest/handle_crash_gen_val_log.sh
@@ -5,7 +5,6 @@ GREEN='\033[1;32m'
GREEN_DARK='\033[0;32m'
GREEN_UNDERLINE='\033[4;32m'
NC='\033[0m'
-#nohup /var/lib/jenkins/workspace/TDinternal/debug/build/bin/taosd -c /var/lib/jenkins/workspace/TDinternal/community/sim/dnode1/cfg >/dev/null &
IN_TDINTERNAL="community"
TDIR=`pwd`
if [[ "$tests_dir" == *"$IN_TDINTERNAL"* ]]; then
@@ -13,7 +12,6 @@ if [[ "$tests_dir" == *"$IN_TDINTERNAL"* ]]; then
else
cd ../../..
fi
-
TOP_DIR=`pwd`
TAOSD_DIR=`find . -name "taosd"|grep -v community|head -n1`
nohup $TAOSD_DIR >/dev/null &
diff --git a/tests/pytest/insert/restfulInsert.py b/tests/pytest/insert/restfulInsert.py
index da797f788f..6489fd31ff 100644
--- a/tests/pytest/insert/restfulInsert.py
+++ b/tests/pytest/insert/restfulInsert.py
@@ -38,7 +38,7 @@ class RestfulInsert:
for i in range(loop):
tableID = threadID * tablesPerThread
if tableID + i >= self.numOfTables : break
- name = 'beijing' if tableID % 2 == 0 else 'shanghai'
+ name = 'beijing' if (tableID + i) % 2 == 0 else 'shanghai'
data = "create table if not exists %s.%s%d using %s.meters tags(%d, '%s')" % (self.dbname, self.tableNamePerfix, tableID + i, self.dbname, tableID + i, name)
response = requests.post(self.url, data, headers = self.header)
if response.status_code != 200:
diff --git a/tests/pytest/pytest_1.sh b/tests/pytest/pytest_1.sh
index bcba331a89..fcb84c4dbb 100755
--- a/tests/pytest/pytest_1.sh
+++ b/tests/pytest/pytest_1.sh
@@ -19,7 +19,8 @@ python3 ./test.py -f insert/randomNullCommit.py
python3 insert/retentionpolicy.py
python3 ./test.py -f insert/alterTableAndInsert.py
python3 ./test.py -f insert/insertIntoTwoTables.py
-python3 ./test.py -f query/isNullTest.py
+#python3 ./test.py -f insert/before_1970.py
+python3 bug2265.py
#table
python3 ./test.py -f table/alter_wal0.py
@@ -33,7 +34,7 @@ python3 ./test.py -f table/alter_column.py
python3 ./test.py -f table/boundary.py
python3 ./test.py -f table/create.py
python3 ./test.py -f table/del_stable.py
-python3 ./test.py -f table/queryWithTaosdKilled.py
+
# tag
python3 ./test.py -f tag_lite/filter.py
@@ -163,10 +164,16 @@ python3 ./test.py -f query/bug1471.py
python3 ./test.py -f query/bug1874.py
python3 ./test.py -f query/bug1875.py
python3 ./test.py -f query/bug1876.py
-python3 ./test.py -f query/bug2218.py
+python3 ./test.py -f query/bug2218.py
+python3 ./test.py -f query/bug2117.py
+python3 ./test.py -f query/bug2118.py
+python3 ./test.py -f query/bug2143.py
+python3 ./test.py -f query/sliding.py
+python3 ./test.py -f query/unionAllTest.py
python3 ./test.py -f query/bug2281.py
python3 ./test.py -f query/bug2119.py
-python3 bug2265.py
+python3 ./test.py -f query/isNullTest.py
+python3 ./test.py -f query/queryWithTaosdKilled.py
python3 ./test.py -f query/floatCompare.py
#stream
@@ -184,6 +191,7 @@ python3 ./test.py -f alter/alter_table_crash.py
python3 ./test.py -f client/client.py
python3 ./test.py -f client/version.py
python3 ./test.py -f client/alterDatabase.py
+python3 ./test.py -f client/noConnectionErrorTest.py
# Misc
python3 testCompress.py
@@ -207,7 +215,7 @@ python3 ./test.py -f functions/function_spread.py -r 1
python3 ./test.py -f functions/function_stddev.py -r 1
python3 ./test.py -f functions/function_sum.py -r 1
python3 ./test.py -f functions/function_top.py -r 1
-#python3 ./test.py -f functions/function_twa.py -r 1
+python3 ./test.py -f functions/function_twa.py -r 1
python3 ./test.py -f functions/function_twa_test2.py
python3 queryCount.py
python3 ./test.py -f query/queryGroupbyWithInterval.py
@@ -219,10 +227,10 @@ python3 test.py -f query/queryFillTest.py
python3 test.py -f tools/taosdemoTest.py
python3 test.py -f tools/taosdumpTest.py
python3 test.py -f tools/lowaTest.py
+python3 test.py -f tools/taosdemoTest2.py
# subscribe
#python3 test.py -f subscribe/singlemeter.py
#python3 test.py -f subscribe/stability.py
#python3 test.py -f subscribe/supertable.py
-
diff --git a/tests/pytest/pytest_2.sh b/tests/pytest/pytest_2.sh
index fededea3bb..28c0a38351 100755
--- a/tests/pytest/pytest_2.sh
+++ b/tests/pytest/pytest_2.sh
@@ -12,6 +12,7 @@ python3 ./test.py -f update/merge_commit_data2.py
python3 ./test.py -f update/merge_commit_data2_update0.py
python3 ./test.py -f update/merge_commit_last-0.py
python3 ./test.py -f update/merge_commit_last.py
+python3 ./test.py -f update/bug_td2279.py
# wal
python3 ./test.py -f wal/addOldWalTest.py
\ No newline at end of file
diff --git a/tests/pytest/query/query.py b/tests/pytest/query/query.py
index da0ef96d0e..87635f86f3 100644
--- a/tests/pytest/query/query.py
+++ b/tests/pytest/query/query.py
@@ -16,7 +16,7 @@ import taos
from util.log import tdLog
from util.cases import tdCases
from util.sql import tdSql
-
+from util.dnodes import tdDnodes
class TDTestCase:
def init(self, conn, logSql):
@@ -44,6 +44,25 @@ class TDTestCase:
tdSql.query("select * from db.st where ts='2020-05-13 10:00:00.000'")
tdSql.checkRows(1)
+ ## test case for https://jira.taosdata.com:18080/browse/TD-2488
+ tdSql.execute("create table m1(ts timestamp, k int) tags(a int)")
+ tdSql.execute("create table t1 using m1 tags(1)")
+ tdSql.execute("create table t2 using m1 tags(2)")
+ tdSql.execute("insert into t1 values('2020-1-1 1:1:1', 1)")
+ tdSql.execute("insert into t1 values('2020-1-1 1:10:1', 2)")
+ tdSql.execute("insert into t2 values('2020-1-1 1:5:1', 99)")
+
+ tdSql.query("select count(*) from m1 where ts = '2020-1-1 1:5:1' ")
+ tdSql.checkRows(1)
+ tdSql.checkData(0, 0, 1)
+
+ tdDnodes.stop(1)
+ tdDnodes.start(1)
+
+ tdSql.query("select count(*) from m1 where ts = '2020-1-1 1:5:1' ")
+ tdSql.checkRows(1)
+ tdSql.checkData(0, 0, 1)
+
def stop(self):
tdSql.close()
tdLog.success("%s successfully executed" % __file__)
diff --git a/tests/pytest/table/alter_wal0.py b/tests/pytest/table/alter_wal0.py
index 15ad69998f..807dd316f2 100644
--- a/tests/pytest/table/alter_wal0.py
+++ b/tests/pytest/table/alter_wal0.py
@@ -43,7 +43,8 @@ class TDTestCase:
print("==============step2")
tdDnodes.stopAll()
- filename = '/var/lib/taos/mnode/wal/wal0'
+ path = tdDnodes.getDnodesRootDir()
+ filename = path + '/dnode1/data/mnode/wal/wal0'
with open(filename, 'rb') as f1:
temp = f1.read()
@@ -57,12 +58,12 @@ class TDTestCase:
print("==============step3")
tdSql.execute("use demo;")
tdSql.query('show tables;')
- tdSql.checkRows(10)
+ tdSql.checkRows(9)
for i in range(11,21):
tdSql.execute("CREATE table if not exists test{num} using meters tags({num});".format(num=i))
tdSql.query('show tables;')
- tdSql.checkRows(20)
+ tdSql.checkRows(19)
print("==============check table numbers and create 10 tables")
diff --git a/tests/script/general/db/alter_tables_d2.sim b/tests/script/general/db/alter_tables_d2.sim
index 9ef39fb556..cd3121057b 100644
--- a/tests/script/general/db/alter_tables_d2.sim
+++ b/tests/script/general/db/alter_tables_d2.sim
@@ -11,11 +11,26 @@ system sh/cfg.sh -n dnode2 -c maxTablesPerVnode -v 5
system sh/exec.sh -n dnode1 -s start
system sh/exec.sh -n dnode2 -s start
-
-sleep 3000
sql connect
sql create dnode $hostname2
-sleep 1000
+
+$x = 0
+step1:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
+sql show dnodes
+print dnode1 $data4_1
+print dnode2 $data4_2
+if $data4_1 != ready then
+ goto step1
+endi
+if $data4_2 != ready then
+ goto step1
+endi
print ============================ step1
@@ -80,10 +95,23 @@ system sh/exec.sh -n dnode1 -s stop -x SIGINT
system sh/exec.sh -n dnode2 -s stop -x SIGINT
system sh/cfg.sh -n dnode1 -c maxTablesPerVnode -v 10
system sh/cfg.sh -n dnode2 -c maxTablesPerVnode -v 10
-sleep 5000
system sh/exec.sh -n dnode1 -s start
system sh/exec.sh -n dnode2 -s start
-sleep 5000
+$x = 0
+step2:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
+sql show mnodes -x step1
+print mnode1 $data2_1
+print mnode1 $data2_2
+print mnode1 $data2_3
+if $data2_1 != master then
+ goto step2
+endi
sql create table db.t100 using db.st tags(0)
sql create table db.t101 using db.st tags(1)
@@ -110,7 +138,6 @@ if $rows != 40 then
return -1
endi
-
sql insert into db.t100 values(now, 1)
sql insert into db.t101 values(now, 1)
sql insert into db.t102 values(now, 1)
@@ -144,10 +171,24 @@ system sh/exec.sh -n dnode1 -s stop -x SIGINT
system sh/exec.sh -n dnode2 -s stop -x SIGINT
system sh/cfg.sh -n dnode1 -c maxTablesPerVnode -v 15
system sh/cfg.sh -n dnode2 -c maxTablesPerVnode -v 15
-sleep 5000
system sh/exec.sh -n dnode1 -s start
system sh/exec.sh -n dnode2 -s start
-sleep 5000
+
+$x = 0
+step3:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
+sql show mnodes -x step3
+print mnode1 $data2_1
+print mnode1 $data2_2
+print mnode1 $data2_3
+if $data2_1 != master then
+ goto step3
+endi
sql create table db.t200 using db.st tags(0)
sql create table db.t201 using db.st tags(1)
@@ -198,7 +239,7 @@ sql insert into db.t219 values(now, 1)
print ============================ step6
sql reset query cache
-sleep 1000
+sleep 100
sql select * from db.t000
if $rows != 1 then
@@ -268,10 +309,23 @@ system sh/exec.sh -n dnode1 -s stop -x SIGINT
system sh/exec.sh -n dnode2 -s stop -x SIGINT
system sh/cfg.sh -n dnode1 -c maxTablesPerVnode -v 20
system sh/cfg.sh -n dnode2 -c maxTablesPerVnode -v 20
-sleep 5000
system sh/exec.sh -n dnode1 -s start
system sh/exec.sh -n dnode2 -s start
-sleep 5000
+$x = 0
+step9:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
+sql show mnodes -x step9
+print mnode1 $data2_1
+print mnode1 $data2_2
+print mnode1 $data2_3
+if $data2_1 != master then
+ goto step9
+endi
sql create table db.t300 using db.st tags(0)
sql create table db.t301 using db.st tags(1)
@@ -321,7 +375,7 @@ if $rows != 80 then
endi
sql reset query cache
-sleep 1000
+sleep 100
sql select * from db.t000
if $rows != 1 then
@@ -351,13 +405,26 @@ endi
print ============================ step10
system sh/exec.sh -n dnode1 -s stop -x SIGINT
system sh/exec.sh -n dnode2 -s stop -x SIGINT
-sleep 5000
system sh/exec.sh -n dnode1 -s start
system sh/exec.sh -n dnode2 -s start
-sleep 5000
+$x = 0
+step10:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
+sql show mnodes -x step10
+print mnode1 $data2_1
+print mnode1 $data2_2
+print mnode1 $data2_3
+if $data2_1 != master then
+ goto step10
+endi
sql reset query cache
-sleep 1000
+sleep 100
sql show db.tables
if $rows != 80 then
@@ -401,10 +468,23 @@ system sh/exec.sh -n dnode1 -s stop -x SIGINT
system sh/exec.sh -n dnode2 -s stop -x SIGINT
system sh/cfg.sh -n dnode1 -c maxTablesPerVnode -v 25
system sh/cfg.sh -n dnode2 -c maxTablesPerVnode -v 25
-sleep 5000
system sh/exec.sh -n dnode1 -s start
system sh/exec.sh -n dnode2 -s start
-sleep 5000
+$x = 0
+step1xx:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
+sql show mnodes -x step1xx
+print mnode1 $data2_1
+print mnode1 $data2_2
+print mnode1 $data2_3
+if $data2_1 != master then
+ goto step1xx
+endi
sql create table db.t400 using db.st tags(0)
sql create table db.t401 using db.st tags(1)
@@ -454,7 +534,7 @@ if $rows != 100 then
endi
sql reset query cache
-sleep 1000
+sleep 100
sql select * from db.t000
if $rows != 1 then
diff --git a/tests/script/general/db/alter_tables_v1.sim b/tests/script/general/db/alter_tables_v1.sim
index dde5eb6d9e..20c4c73363 100644
--- a/tests/script/general/db/alter_tables_v1.sim
+++ b/tests/script/general/db/alter_tables_v1.sim
@@ -5,8 +5,6 @@ system sh/cfg.sh -n dnode1 -c maxVgroupsPerDb -v 1
system sh/cfg.sh -n dnode1 -c maxTablesPerVnode -v 10
system sh/exec.sh -n dnode1 -s start
-
-sleep 3000
sql connect
print ============================ step1
@@ -51,9 +49,22 @@ print ============================ step3
system sh/exec.sh -n dnode1 -s stop -x SIGINT
system sh/cfg.sh -n dnode1 -c maxTablesPerVnode -v 20
-sleep 5000
system sh/exec.sh -n dnode1 -s start
-sleep 5000
+$x = 0
+step2:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
+sql show mnodes -x step2
+print mnode1 $data2_1
+print mnode1 $data2_2
+print mnode1 $data2_3
+if $data2_1 != master then
+ goto step2
+endi
sql create table db.t10 using db.st tags(0)
sql create table db.t11 using db.st tags(1)
@@ -91,9 +102,22 @@ endi
print ============================ step5
system sh/exec.sh -n dnode1 -s stop -x SIGINT
system sh/cfg.sh -n dnode1 -c maxTablesPerVnode -v 30
-sleep 5000
system sh/exec.sh -n dnode1 -s start
-sleep 5000
+$x = 0
+step5:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
+sql show mnodes -x step5
+print mnode1 $data2_1
+print mnode1 $data2_2
+print mnode1 $data2_3
+if $data2_1 != master then
+ goto step5
+endi
sql create table db.t20 using db.st tags(0)
sql create table db.t21 using db.st tags(1)
@@ -124,7 +148,7 @@ sql insert into db.t29 values(now, 1)
print ============================ step6
sql reset query cache
-sleep 1000
+sleep 100
sql select * from db.t0
if $rows != 1 then
@@ -148,9 +172,22 @@ endi
print ============================ step7
system sh/exec.sh -n dnode1 -s stop -x SIGINT
-sleep 5000
system sh/exec.sh -n dnode1 -s start
-sleep 5000
+$x = 0
+step7:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
+sql show mnodes -x step7
+print mnode1 $data2_1
+print mnode1 $data2_2
+print mnode1 $data2_3
+if $data2_1 != master then
+ goto step7
+endi
sql reset query cache
sleep 1000
@@ -190,9 +227,22 @@ endi
print ============================ step9
system sh/exec.sh -n dnode1 -s stop -x SIGINT
system sh/cfg.sh -n dnode1 -c maxTablesPerVnode -v 40
-sleep 5000
system sh/exec.sh -n dnode1 -s start
-sleep 5000
+$x = 0
+step9:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
+sql show mnodes -x step9
+print mnode1 $data2_1
+print mnode1 $data2_2
+print mnode1 $data2_3
+if $data2_1 != master then
+ goto step9
+endi
sql create table db.t30 using db.st tags(0)
sql create table db.t31 using db.st tags(1)
@@ -249,12 +299,24 @@ if $rows != 40 then
return -1
endi
-
print ============================ step10
system sh/exec.sh -n dnode1 -s stop -x SIGINT
-sleep 5000
system sh/exec.sh -n dnode1 -s start
-sleep 5000
+$x = 0
+step10:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
+sql show mnodes -x step10
+print mnode1 $data2_1
+print mnode1 $data2_2
+print mnode1 $data2_3
+if $data2_1 != master then
+ goto step10
+endi
sql reset query cache
sleep 1000
@@ -294,9 +356,22 @@ endi
print ============================ step12
system sh/exec.sh -n dnode1 -s stop -x SIGINT
system sh/cfg.sh -n dnode1 -c maxTablesPerVnode -v 50
-sleep 5000
system sh/exec.sh -n dnode1 -s start
-sleep 5000
+$x = 0
+step12:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
+sql show mnodes -x step12
+print mnode1 $data2_1
+print mnode1 $data2_2
+print mnode1 $data2_3
+if $data2_1 != master then
+ goto step12
+endi
sql create table db.t40 using db.st tags(0)
sql create table db.t41 using db.st tags(1)
diff --git a/tests/script/general/db/alter_tables_v4.sim b/tests/script/general/db/alter_tables_v4.sim
index 7c9262874d..b57b2c0320 100644
--- a/tests/script/general/db/alter_tables_v4.sim
+++ b/tests/script/general/db/alter_tables_v4.sim
@@ -5,8 +5,6 @@ system sh/cfg.sh -n dnode1 -c maxVgroupsPerDb -v 4
system sh/cfg.sh -n dnode1 -c maxTablesPerVnode -v 5
system sh/exec.sh -n dnode1 -s start
-
-sleep 3000
sql connect
print ============================ step1
@@ -70,9 +68,22 @@ endi
print ============================ step3
system sh/exec.sh -n dnode1 -s stop -x SIGINT
system sh/cfg.sh -n dnode1 -c maxTablesPerVnode -v 10
-sleep 5000
system sh/exec.sh -n dnode1 -s start
-sleep 5000
+$x = 0
+step3:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
+sql show mnodes -x step3
+print mnode1 $data2_1
+print mnode1 $data2_2
+print mnode1 $data2_3
+if $data2_1 != master then
+ goto step3
+endi
sql create table db.t100 using db.st tags(0)
sql create table db.t101 using db.st tags(1)
@@ -131,9 +142,22 @@ endi
print ============================ step5
system sh/exec.sh -n dnode1 -s stop -x SIGINT
system sh/cfg.sh -n dnode1 -c maxTablesPerVnode -v 15
-sleep 5000
system sh/exec.sh -n dnode1 -s start
-sleep 5000
+$x = 0
+step5:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
+sql show mnodes -x step5
+print mnode1 $data2_1
+print mnode1 $data2_2
+print mnode1 $data2_3
+if $data2_1 != master then
+ goto step5
+endi
sql create table db.t200 using db.st tags(0)
sql create table db.t201 using db.st tags(1)
@@ -184,7 +208,7 @@ sql insert into db.t219 values(now, 1)
print ============================ step6
sql reset query cache
-sleep 1000
+sleep 100
sql select * from db.t000
if $rows != 1 then
@@ -250,9 +274,22 @@ endi
print ============================ step9
system sh/exec.sh -n dnode1 -s stop -x SIGINT
system sh/cfg.sh -n dnode1 -c maxTablesPerVnode -v 20
-sleep 5000
system sh/exec.sh -n dnode1 -s start
-sleep 5000
+$x = 0
+step9:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
+sql show mnodes -x step9
+print mnode1 $data2_1
+print mnode1 $data2_2
+print mnode1 $data2_3
+if $data2_1 != master then
+ goto step9
+endi
sql create table db.t300 using db.st tags(0)
sql create table db.t301 using db.st tags(1)
@@ -331,9 +368,22 @@ endi
print ============================ step10
system sh/exec.sh -n dnode1 -s stop -x SIGINT
-sleep 5000
system sh/exec.sh -n dnode1 -s start
-sleep 5000
+$x = 0
+step10:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
+sql show mnodes -x step10
+print mnode1 $data2_1
+print mnode1 $data2_2
+print mnode1 $data2_3
+if $data2_1 != master then
+ goto step10
+endi
sql reset query cache
sleep 1000
@@ -378,9 +428,24 @@ endi
print ============================ step12
system sh/exec.sh -n dnode1 -s stop -x SIGINT
system sh/cfg.sh -n dnode1 -c maxTablesPerVnode -v 25
-sleep 5000
system sh/exec.sh -n dnode1 -s start
-sleep 5000
+$x = 0
+step12:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
+sql show mnodes -x step12
+print mnode1 $data2_1
+print mnode1 $data2_2
+print mnode1 $data2_3
+if $data2_1 != master then
+ goto step12
+endi
+
+
sql create table db.t400 using db.st tags(0)
sql create table db.t401 using db.st tags(1)
sql create table db.t402 using db.st tags(2)
diff --git a/tests/script/general/db/delete_reusevnode.sim b/tests/script/general/db/delete_reusevnode.sim
index 5781c384fe..4364a760a6 100644
--- a/tests/script/general/db/delete_reusevnode.sim
+++ b/tests/script/general/db/delete_reusevnode.sim
@@ -5,7 +5,6 @@ system sh/deploy.sh -n dnode1 -i 1
print ========= start dnodes
system sh/exec.sh -n dnode1 -s start
-sleep 3000
sql connect
print ======== step1
@@ -38,7 +37,6 @@ if $rows != 0 then
endi
system sh/stop_dnodes.sh
-sleep 3000
system sh/deploy.sh -n dnode1 -i 1
print ========= start dnodes
diff --git a/tests/script/general/db/delete_writing1.sim b/tests/script/general/db/delete_writing1.sim
index 93d41b2fa3..8b369b4e3d 100644
--- a/tests/script/general/db/delete_writing1.sim
+++ b/tests/script/general/db/delete_writing1.sim
@@ -22,7 +22,6 @@ system sh/cfg.sh -n dnode4 -c mnodeEqualVnodeNum -v 4
print ========= start dnodes
system sh/exec.sh -n dnode1 -s start
-sleep 3000
sql connect
sql create database db
diff --git a/tests/script/general/http/restful_full.sim b/tests/script/general/http/restful_full.sim
index 94ecb59f75..7e12d30ac9 100644
--- a/tests/script/general/http/restful_full.sim
+++ b/tests/script/general/http/restful_full.sim
@@ -81,7 +81,7 @@ print =============== step2 - no db
#11
system_content curl -H 'Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04' -d 'show databases' 127.0.0.1:7111/rest/sql
print 11-> $system_content
-if $system_content != @{"status":"succ","head":["name","created_time","ntables","vgroups","replica","quorum","days","keep1,keep2,keep(D)","cache(MB)","blocks","minrows","maxrows","wallevel","fsync","comp","precision","update","status"],"data":[],"rows":0}@ then
+if $system_content != @{"status":"succ","head":["name","created_time","ntables","vgroups","replica","quorum","days","keep1,keep2,keep(D)","cache(MB)","blocks","minrows","maxrows","wallevel","fsync","comp","cachelast","precision","update","status"],"data":[],"rows":0}@ then
return -1
endi
diff --git a/tests/script/general/parser/mixed_blocks.sim b/tests/script/general/parser/mixed_blocks.sim
index d3558560df..946dbe8835 100644
--- a/tests/script/general/parser/mixed_blocks.sim
+++ b/tests/script/general/parser/mixed_blocks.sim
@@ -144,4 +144,20 @@ if $data03 != 319 then
return -1
endi
-system sh/exec.sh -n dnode1 -s stop -x SIGINT
\ No newline at end of file
+print ===================> TD-2488
+sql create table m1(ts timestamp, k int) tags(a int);
+sql create table t1 using m1 tags(1);
+sql create table t2 using m1 tags(2);
+sql insert into t1 values('2020-1-1 1:1:1', 1);
+sql insert into t1 values('2020-1-1 1:10:1', 2);
+sql insert into t2 values('2020-1-1 1:5:1', 99);
+
+print ================== restart server to commit data into disk
+system sh/exec.sh -n dnode1 -s stop -x SIGINT
+sleep 3000
+system sh/exec.sh -n dnode1 -s start
+print ================== server restart completed
+sql select ts from m1 where ts='2020-1-1 1:5:1'
+if $rows != 1 then
+ return -1
+endi
\ No newline at end of file
diff --git a/tests/script/general/table/delete_writing.sim b/tests/script/general/table/delete_writing.sim
index b55d55eb8a..2a7fb09104 100644
--- a/tests/script/general/table/delete_writing.sim
+++ b/tests/script/general/table/delete_writing.sim
@@ -21,8 +21,6 @@ system sh/cfg.sh -n dnode4 -c mnodeEqualVnodeNum -v 4
print ========= start dnodes
system sh/exec.sh -n dnode1 -s start
-
-sleep 3000
sql connect
sql create database db
diff --git a/tests/script/general/wal/sync.sim b/tests/script/general/wal/sync.sim
index c6f7402b87..3a89523918 100644
--- a/tests/script/general/wal/sync.sim
+++ b/tests/script/general/wal/sync.sim
@@ -31,7 +31,6 @@ system sh/cfg.sh -n dnode3 -c maxSQLLength -v 940032
print ============== deploy
system sh/exec.sh -n dnode1 -s start
-sleep 5001
sql connect
sql create dnode $hostname2
@@ -43,8 +42,8 @@ print =============== step1
$x = 0
show1:
$x = $x + 1
- sleep 2000
- if $x == 5 then
+ sleep 1000
+ if $x == 10 then
return -1
endi
sql show mnodes -x show1
@@ -82,7 +81,7 @@ restful d1 table_rest 1591772800 30000
restful d1 table_rest 1591872800 30000
restful d1 table_rest 1591972800 30000
-sleep 1000
+sleep 100
sql select * from table_rest;
print rows: $rows
if $rows != 300000 then
@@ -91,29 +90,51 @@ endi
print =============== step3
system sh/exec.sh -n dnode1 -s stop -x SIGINT
-sleep 5000
sql select * from table_rest;
print rows: $rows
if $rows != 300000 then
return -1
endi
system sh/exec.sh -n dnode1 -s start -x SIGINT
-sleep 5000
+
+$x = 0
+a1:
+ $x = $x + 1
+ sleep 1000
+ if $x == 40 then
+ return -1
+ endi
+
+sql show vgroups
+print online vnodes $data03
+if $data03 != 3 then
+ goto a1
+endi
print =============== step4
system sh/exec.sh -n dnode2 -s stop -x SIGINT
-sleep 5000
sql select * from table_rest;
print rows: $rows
if $rows != 300000 then
return -1
endi
system sh/exec.sh -n dnode2 -s start -x SIGINT
-sleep 5000
+$x = 0
+a2:
+ $x = $x + 1
+ sleep 1000
+ if $x == 40 then
+ return -1
+ endi
+
+sql show vgroups
+print online vnodes $data03
+if $data03 != 3 then
+ goto a2
+endi
print =============== step5
system sh/exec.sh -n dnode3 -s stop -x SIGINT
-sleep 5000
sql select * from table_rest;
print rows: $rows
if $rows != 300000 then
diff --git a/tests/script/jenkins/basic.txt b/tests/script/jenkins/basic.txt
index 34b057e71b..e3555e700a 100644
--- a/tests/script/jenkins/basic.txt
+++ b/tests/script/jenkins/basic.txt
@@ -286,8 +286,11 @@ cd ../../../debug; make
./test.sh -f unique/dnode/balance3.sim
./test.sh -f unique/dnode/balancex.sim
./test.sh -f unique/dnode/data1.sim
+./test.sh -f unique/dnode/m2.sim
+./test.sh -f unique/dnode/m3.sim
./test.sh -f unique/dnode/offline1.sim
./test.sh -f unique/dnode/offline2.sim
+./test.sh -f unique/dnode/offline3.sim
./test.sh -f unique/dnode/reason.sim
./test.sh -f unique/dnode/remove1.sim
./test.sh -f unique/dnode/remove2.sim
diff --git a/tests/script/jenkins/basic_3.txt b/tests/script/jenkins/basic_3.txt
index 83b10a371c..59ed486d20 100644
--- a/tests/script/jenkins/basic_3.txt
+++ b/tests/script/jenkins/basic_3.txt
@@ -1,38 +1,4 @@
-./test.sh -f unique/stable/balance_replica1.sim
-./test.sh -f unique/stable/dnode2_stop.sim
-./test.sh -f unique/stable/dnode2.sim
-./test.sh -f unique/stable/dnode3.sim
-./test.sh -f unique/stable/replica2_dnode4.sim
-./test.sh -f unique/stable/replica2_vnode3.sim
-./test.sh -f unique/stable/replica3_dnode6.sim
-./test.sh -f unique/stable/replica3_vnode3.sim
-
-./test.sh -f unique/mnode/mgmt20.sim
-./test.sh -f unique/mnode/mgmt21.sim
-./test.sh -f unique/mnode/mgmt22.sim
-./test.sh -f unique/mnode/mgmt23.sim
-./test.sh -f unique/mnode/mgmt24.sim
-#./test.sh -f unique/mnode/mgmt25.sim
-#./test.sh -f unique/mnode/mgmt26.sim
-./test.sh -f unique/mnode/mgmt33.sim
-./test.sh -f unique/mnode/mgmt34.sim
-./test.sh -f unique/mnode/mgmtr2.sim
-
-
-
-./test.sh -f general/parser/stream_on_sys.sim
-./test.sh -f general/stream/metrics_del.sim
-./test.sh -f general/stream/metrics_n.sim
-./test.sh -f general/stream/metrics_replica1_vnoden.sim
-./test.sh -f general/stream/restart_stream.sim
-./test.sh -f general/stream/stream_3.sim
-./test.sh -f general/stream/stream_restart.sim
-./test.sh -f general/stream/table_1.sim
-./test.sh -f general/stream/table_del.sim
-./test.sh -f general/stream/table_n.sim
-./test.sh -f general/stream/table_replica1_vnoden.sim
-
./test.sh -f unique/arbitrator/check_cluster_cfg_para.sim
#./test.sh -f unique/arbitrator/dn2_mn1_cache_file_sync.sim
./test.sh -f unique/arbitrator/dn3_mn1_full_createTableFail.sim
@@ -79,3 +45,35 @@
./test.sh -f unique/migrate/mn2_vn2_repl2_rmMnodeVnodeDir.sim
./test.sh -f unique/migrate/mn2_vn2_repl2_rmMnodeVnodeDir_stopAll_starAll.sim
./test.sh -f unique/migrate/mn2_vn2_repl2_rmVnodeDir.sim
+
+./test.sh -f unique/stable/balance_replica1.sim
+./test.sh -f unique/stable/dnode2_stop.sim
+./test.sh -f unique/stable/dnode2.sim
+./test.sh -f unique/stable/dnode3.sim
+./test.sh -f unique/stable/replica2_dnode4.sim
+./test.sh -f unique/stable/replica2_vnode3.sim
+./test.sh -f unique/stable/replica3_dnode6.sim
+./test.sh -f unique/stable/replica3_vnode3.sim
+
+./test.sh -f unique/mnode/mgmt20.sim
+./test.sh -f unique/mnode/mgmt21.sim
+./test.sh -f unique/mnode/mgmt22.sim
+./test.sh -f unique/mnode/mgmt23.sim
+./test.sh -f unique/mnode/mgmt24.sim
+#./test.sh -f unique/mnode/mgmt25.sim
+#./test.sh -f unique/mnode/mgmt26.sim
+./test.sh -f unique/mnode/mgmt33.sim
+./test.sh -f unique/mnode/mgmt34.sim
+./test.sh -f unique/mnode/mgmtr2.sim
+
+./test.sh -f general/parser/stream_on_sys.sim
+./test.sh -f general/stream/metrics_del.sim
+./test.sh -f general/stream/metrics_n.sim
+./test.sh -f general/stream/metrics_replica1_vnoden.sim
+./test.sh -f general/stream/restart_stream.sim
+./test.sh -f general/stream/stream_3.sim
+./test.sh -f general/stream/stream_restart.sim
+./test.sh -f general/stream/table_1.sim
+./test.sh -f general/stream/table_del.sim
+./test.sh -f general/stream/table_n.sim
+./test.sh -f general/stream/table_replica1_vnoden.sim
diff --git a/tests/script/jenkins/unique.txt b/tests/script/jenkins/unique.txt
index b271f5b726..8e3988e79e 100644
--- a/tests/script/jenkins/unique.txt
+++ b/tests/script/jenkins/unique.txt
@@ -29,8 +29,12 @@ cd ../../../debug; make
./test.sh -f unique/dnode/balance2.sim
./test.sh -f unique/dnode/balance3.sim
./test.sh -f unique/dnode/balancex.sim
+./test.sh -f unique/dnode/m2.sim
+./test.sh -f unique/dnode/m3.sim
./test.sh -f unique/dnode/offline1.sim
./test.sh -f unique/dnode/offline2.sim
+./test.sh -f unique/dnode/offline3.sim
+./test.sh -f unique/dnode/reason.sim
./test.sh -f unique/dnode/remove1.sim
./test.sh -f unique/dnode/remove2.sim
./test.sh -f unique/dnode/vnode_clean.sim
diff --git a/tests/script/sh/deploy.sh b/tests/script/sh/deploy.sh
index cd2f3772eb..9b61a33d45 100755
--- a/tests/script/sh/deploy.sh
+++ b/tests/script/sh/deploy.sh
@@ -132,10 +132,12 @@ echo "cqdebugFlag 143" >> $TAOS_CFG
echo "monitor 0" >> $TAOS_CFG
echo "monitorInterval 1" >> $TAOS_CFG
echo "http 0" >> $TAOS_CFG
+echo "slaveQuery 0" >> $TAOS_CFG
echo "numOfThreadsPerCore 2.0" >> $TAOS_CFG
echo "defaultPass taosdata" >> $TAOS_CFG
echo "numOfLogLines 20000000" >> $TAOS_CFG
echo "mnodeEqualVnodeNum 0" >> $TAOS_CFG
+echo "balanceInterval 1" >> $TAOS_CFG
echo "clog 2" >> $TAOS_CFG
#echo "cache 1" >> $TAOS_CFG
echo "days 10" >> $TAOS_CFG
diff --git a/tests/script/unique/arbitrator/dn3_mn1_r3_vnode_delDir.sim b/tests/script/unique/arbitrator/dn3_mn1_r3_vnode_delDir.sim
index c647a35a5c..c9c85cb45d 100644
--- a/tests/script/unique/arbitrator/dn3_mn1_r3_vnode_delDir.sim
+++ b/tests/script/unique/arbitrator/dn3_mn1_r3_vnode_delDir.sim
@@ -360,12 +360,14 @@ print ============== step7: stop dnode3/dnode2, and cluster unable to provide se
system sh/exec.sh -n dnode2 -s stop -x SIGINT
system sh/exec.sh -n dnode3 -s stop -x SIGINT
sleep 3000
-sql_error select count(*) from $stb
+sql select count(*) from $stb -x s71
+s71:
print ============== step8: restart dnode2, and cluster Still unable to provide services
system sh/exec.sh -n dnode2 -s start
sleep 3000
-sql_error select count(*) from $stb
+sql select count(*) from $stb -x s81
+s81:
print ============== step9: restart dnode3, and cluster Resume service delivery
system sh/exec.sh -n dnode3 -s start
diff --git a/tests/script/unique/arbitrator/dn3_mn1_replica_change.sim b/tests/script/unique/arbitrator/dn3_mn1_replica_change.sim
index 23ace47e3c..387ae4625f 100644
--- a/tests/script/unique/arbitrator/dn3_mn1_replica_change.sim
+++ b/tests/script/unique/arbitrator/dn3_mn1_replica_change.sim
@@ -45,15 +45,30 @@ system sh/exec_tarbitrator.sh -s start
print ============== step1: start dnode1, only deploy mnode
system sh/exec.sh -n dnode1 -s start
-sleep 3000
sql connect
print ============== step2: start dnode2 and add into cluster , then create database with replica 1, and create table, insert data
system sh/exec.sh -n dnode2 -s start
sql create dnode $hostname2
-sleep 3000
-$sleepTimer = 10000
+$x = 0
+step1:
+ $x = $x + 1
+ sleep 1000
+ if $x == 40 then
+ return -1
+ endi
+
+sql show dnodes
+print dnode1 $data4_1
+print dnode2 $data4_2
+
+if $data4_1 != ready then
+ goto step1
+endi
+if $data4_2 != ready then
+ goto step1
+endi
$db = db
sql create database $db replica 1
@@ -84,7 +99,6 @@ while $i < $tblNum
endw
sql select count(*) from $stb
-sleep 1000
print data00 $data00
if $data00 != $totalRows then
return -1
@@ -92,118 +106,65 @@ endi
print ============== step2-1: stop dnode2 for falling disc, then restart dnode2, and check rows
system sh/exec.sh -n dnode2 -s stop -x SIGINT
-sleep $sleepTimer
-
-
-$loopCnt = 0
-wait_dnode2_offline_0:
-$loopCnt = $loopCnt + 1
-if $loopCnt == 10 then
- return -1
-endi
-sql show dnodes
-if $rows != 2 then
- sleep 2000
- goto wait_dnode2_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
-print $data0_3 $data1_3 $data2_3 $data3_3 $data4_3
-#print $data0_4 $data1_4 $data2_4 $data3_4 $data4_4
-#print $data0_5 $data1_5 $data2_5 $data3_5 $data4_5
-#print $data0_6 $data1_6 $data2_6 $data3_6 $data4_6
-#$dnode1Status = $data4_1
-$dnode2Status = $data4_2
-#$dnode3Status = $data4_3
-#$dnode4Status = $data4_4
-#$dnode5Status = $data4_5
-
-if $dnode2Status != offline then
- sleep 2000
- goto wait_dnode2_offline_0
-endi
-
system sh/exec.sh -n dnode2 -s start
-sleep $sleepTimer
+$x = 0
+a0:
+ $x = $x + 1
+ sleep 1000
+ if $x == 40 then
+ return -1
+ endi
-$loopCnt = 0
-wait_dnode2_reready:
-$loopCnt = $loopCnt + 1
-if $loopCnt == 10 then
- return -1
-endi
-sql show dnodes
-if $rows != 2 then
- sleep 2000
- goto wait_dnode2_reready
-endi
-print $data0_1 $data1_1 $data2_1 $data3_1 $data4_1
-print $data0_2 $data1_2 $data2_2 $data3_2 $data4_2
-print $data0_3 $data1_3 $data2_3 $data3_3 $data4_3
-#print $data0_4 $data1_4 $data2_4 $data3_4 $data4_4
-#print $data0_5 $data1_5 $data2_5 $data3_5 $data4_5
-#print $data0_6 $data1_6 $data2_6 $data3_6 $data4_6
-#$dnode1Status = $data4_1
-$dnode2Status = $data4_2
-#$dnode3Status = $data4_3
-#$dnode4Status = $data4_4
-#$dnode5Status = $data4_5
-
-if $dnode2Status != ready then
- sleep 2000
- goto wait_dnode2_reready
+sql show vgroups
+print online vnodes $data03
+if $data03 != 1 then
+ goto a0
endi
sql select count(*) from $stb
-sleep 1000
print data00 $data00
if $data00 != $totalRows then
return -1
endi
-
print ============== step3: start dnode3 and add into cluster , then alter replica from 1 to 2, and waiting sync
system sh/exec.sh -n dnode3 -s start
sql create dnode $hostname3
-sleep 3000
-sql alter database $db replica 2
-sleep $sleepTimer
-$loopCnt = 0
-wait_dnode3_ready:
-$loopCnt = $loopCnt + 1
-if $loopCnt == 10 then
- return -1
-endi
+$x = 0
+step2:
+ $x = $x + 1
+ sleep 1000
+ if $x == 40 then
+ return -1
+ endi
sql show dnodes
-if $rows != 3 then
- sleep 2000
- goto wait_dnode3_ready
-endi
-print $data0_1 $data1_1 $data2_1 $data3_1 $data4_1
-print $data0_2 $data1_2 $data2_2 $data3_2 $data4_2
-print $data0_3 $data1_3 $data2_3 $data3_3 $data4_3
-#print $data0_4 $data1_4 $data2_4 $data3_4 $data4_4
-#print $data0_5 $data1_5 $data2_5 $data3_5 $data4_5
-#print $data0_6 $data1_6 $data2_6 $data3_6 $data4_6
-#$dnode1Status = $data4_1
-$dnode2Status = $data4_2
-$dnode3Status = $data4_3
-#$dnode4Status = $data4_4
-#$dnode5Status = $data4_5
+print dnode1 $data4_1
+print dnode2 $data4_2
+print dnode3 $data4_3
-if $dnode2Status != ready then
- sleep 2000
- goto wait_dnode3_ready
-endi
-if $dnode3Status != ready then
- sleep 2000
- goto wait_dnode3_ready
+if $data4_3 != ready then
+ goto step2
+endi
+
+sql alter database $db replica 2
+
+$x = 0
+a1:
+ $x = $x + 1
+ sleep 1000
+ if $x == 40 then
+ return -1
+ endi
+
+sql show vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto a1
endi
-sleep $sleepTimer
# check using select
sql select count(*) from $stb
print data00 $data00
@@ -211,44 +172,22 @@ if $data00 != $totalRows then
return -1
endi
-
print ============== step4: stop dnode2 for checking if sync ok
system sh/exec.sh -n dnode2 -s stop
-sleep $sleepTimer
-$loopCnt = 0
-wait_dnode2_offline:
-$loopCnt = $loopCnt + 1
-if $loopCnt == 10 then
- return -1
+$x = 0
+a2:
+ $x = $x + 1
+ sleep 1000
+ if $x == 40 then
+ return -1
+ endi
+
+sql show vgroups
+print online vnodes $data03
+if $data03 != 1 then
+ goto a2
endi
-sql show dnodes
-if $rows != 3 then
- sleep 2000
- goto wait_dnode2_offline
-endi
-print $data0_1 $data1_1 $data2_1 $data3_1 $data4_1
-print $data0_2 $data1_2 $data2_2 $data3_2 $data4_2
-print $data0_3 $data1_3 $data2_3 $data3_3 $data4_3
-#print $data0_4 $data1_4 $data2_4 $data3_4 $data4_4
-#print $data0_5 $data1_5 $data2_5 $data3_5 $data4_5
-#print $data0_6 $data1_6 $data2_6 $data3_6 $data4_6
-#$dnode1Status = $data4_1
-$dnode2Status = $data4_2
-$dnode3Status = $data4_3
-#$dnode4Status = $data4_4
-#$dnode5Status = $data4_5
-
-if $dnode2Status != offline then
- sleep 2000
- goto wait_dnode2_offline
-endi
-if $dnode3Status != ready then
- sleep 2000
- goto wait_dnode2_offline
-endi
-
-sleep $sleepTimer # waitting for move master vnode of dnode2 to dnode3
# check using select
sql select count(*) from $stb
print data00 $data00
@@ -258,38 +197,20 @@ endi
print ============== step5: restart dnode2
system sh/exec.sh -n dnode2 -s start
-sleep 3000
+$x = 0
+a3:
+ $x = $x + 1
+ sleep 1000
+ if $x == 40 then
+ return -1
+ endi
-$loopCnt = 0
-wait_dnode2_ready:
-$loopCnt = $loopCnt + 1
-if $loopCnt == 10 then
- return -1
+sql show vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto a3
endi
-sql show dnodes
-if $rows != 3 then
- sleep 2000
- goto wait_dnode2_ready
-endi
-print $data0_1 $data1_1 $data2_1 $data3_1 $data4_1
-print $data0_2 $data1_2 $data2_2 $data3_2 $data4_2
-print $data0_3 $data1_3 $data2_3 $data3_3 $data4_3
-#print $data0_4 $data1_4 $data2_4 $data3_4 $data4_4
-#print $data0_5 $data1_5 $data2_5 $data3_5 $data4_5
-#print $data0_6 $data1_6 $data2_6 $data3_6 $data4_6
-#$dnode1Status = $data4_1
-$dnode2Status = $data4_2
-$dnode3Status = $data4_3
-#$dnode4Status = $data4_4
-#$dnode5Status = $data4_5
-
-if $dnode2Status != ready then
- sleep 2000
- goto wait_dnode2_ready
-endi
-
-sleep $sleepTimer
# check using select
sql select count(*) from $stb
print data00 $data00
@@ -300,40 +221,39 @@ endi
print ============== step6: start dnode4 and add into cluster , then alter replica from 2 to 3, and waiting sync
system sh/exec.sh -n dnode4 -s start
sql create dnode $hostname4
-sleep 3000
-
-sql alter database $db replica 3
-sleep $sleepTimer
-$loopCnt = 0
-wait_dnode4_ready:
-$loopCnt = $loopCnt + 1
-if $loopCnt == 10 then
- return -1
-endi
+$x = 0
+step6:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
sql show dnodes
-if $rows != 4 then
- sleep 2000
- goto wait_dnode4_ready
-endi
-print $data0_1 $data1_1 $data2_1 $data3_1 $data4_1
-print $data0_2 $data1_2 $data2_2 $data3_2 $data4_2
-print $data0_3 $data1_3 $data2_3 $data3_3 $data4_3
-print $data0_4 $data1_4 $data2_4 $data3_4 $data4_4
-#print $data0_5 $data1_5 $data2_5 $data3_5 $data4_5
-#print $data0_6 $data1_6 $data2_6 $data3_6 $data4_6
-#$dnode1Status = $data4_1
-#$dnode2Status = $data4_2
-$dnode3Status = $data4_3
-$dnode4Status = $data4_4
-#$dnode5Status = $data4_5
+print dnode1 $data4_1
+print dnode2 $data4_2
+print dnode3 $data4_3
+print dnode4 $data4_4
-if $dnode4Status != ready then
- sleep 2000
- goto wait_dnode4_ready
+if $data4_4 != ready then
+ goto step6
+endi
+
+sql alter database $db replica 3
+$x = 0
+a4:
+ $x = $x + 1
+ sleep 1000
+ if $x == 40 then
+ return -1
+ endi
+
+sql show vgroups
+print online vnodes $data03
+if $data03 != 3 then
+ goto a4
endi
-sleep $sleepTimer
# check using select
sql select count(*) from $stb
print data00 $data00
@@ -343,44 +263,20 @@ endi
print ============== step7: alter replica from 3 to 2, and waiting sync
sql alter database $db replica 2
-sleep $sleepTimer
-$loopCnt = 0
-wait_vgroups_replic_to_2:
-$loopCnt = $loopCnt + 1
-if $loopCnt == 10 then
- return -1
+$x = 0
+a5:
+ $x = $x + 1
+ sleep 1000
+ if $x == 40 then
+ return -1
+ endi
+
+sql show vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto a5
endi
-sql show vgroups
-print $data0_1 $data1_1 $data2_1 $data3_1 $data4_1 $data5_1 $data6_1 $data7_1 $data8_1 $data9_1 $data10_1
-print $data0_2 $data1_2 $data2_2 $data3_2 $data4_2 $data5_2 $data6_2 $data7_2 $data8_2 $data9_2 $data10_2
-print $data0_3 $data1_3 $data2_3 $data3_3 $data4_3 $data5_3 $data6_3 $data7_3 $data8_3 $data9_3 $data10_3
-print $data0_4 $data1_4 $data2_4 $data3_4 $data4_4 $data5_4 $data6_4 $data7_4 $data8_4 $data9_4 $data10_4
-#print $data0_5 $data1_5 $data2_5 $data3_5 $data4_5
-#print $data0_6 $data1_6 $data2_6 $data3_6 $data4_6
-$thirdDnode_2 = $data8_1
-$thirdDnode_3 = $data8_2
-$thirdDnode_4 = $data8_3
-$thirdDnode_5 = $data8_4
-
-if $thirdDnode_2 != null then
- sleep 2000
- goto wait_vgroups_replic_to_2
-endi
-if $thirdDnode_3 != null then
- sleep 2000
- goto wait_vgroups_replic_to_2
-endi
-if $thirdDnode_4 != null then
- sleep 2000
- goto wait_vgroups_replic_to_2
-endi
-if $thirdDnode_5 != null then
- sleep 2000
- goto wait_vgroups_replic_to_2
-endi
-
-sleep $sleepTimer #waiting del one replica data
# check using select
sql select count(*) from $stb
print data00 $data00
@@ -390,85 +286,20 @@ endi
print ============== step8: alter replica from 2 to 1, and waiting sync
sql alter database $db replica 1
-sleep $sleepTimer
-$loopCnt = 0
-wait_vgroups_replic_to_1:
-$loopCnt = $loopCnt + 1
-if $loopCnt == 10 then
- return -1
+$x = 0
+a6:
+ $x = $x + 1
+ sleep 1000
+ if $x == 40 then
+ return -1
+ endi
+
+sql show vgroups
+print online vnodes $data03
+if $data03 != 1 then
+ goto a6
endi
-sql show vgroups
-print $data0_1 $data1_1 $data2_1 $data3_1 $data4_1 $data5_1 $data6_1 $data7_1 $data8_1
-print $data0_2 $data1_2 $data2_2 $data3_2 $data4_2 $data5_2 $data6_2 $data7_2 $data8_2
-print $data0_3 $data1_3 $data2_3 $data3_3 $data4_3 $data5_3 $data6_3 $data7_3 $data8_3
-print $data0_4 $data1_4 $data2_4 $data3_4 $data4_4 $data5_4 $data6_4 $data7_4 $data8_4
-#print $data0_5 $data1_5 $data2_5 $data3_5 $data4_5
-#print $data0_6 $data1_6 $data2_6 $data3_6 $data4_6
-$sencodDnode_2 = $data6_1
-$sencodDnode_3 = $data6_2
-$sencodDnode_4 = $data6_3
-$sencodDnode_5 = $data6_4
-
-if $sencodDnode_2 != null then
- sleep 2000
- goto wait_vgroups_replic_to_1
-endi
-if $sencodDnode_3 != null then
- sleep 2000
- goto wait_vgroups_replic_to_1
-endi
-if $sencodDnode_4 != null then
- sleep 2000
- goto wait_vgroups_replic_to_1
-endi
-if $sencodDnode_5 != null then
- sleep 2000
- goto wait_vgroups_replic_to_1
-endi
-
-$loopCnt = 0
-all_dnodes_ready:
-$loopCnt = $loopCnt + 1
-if $loopCnt == 10 then
- return -1
-endi
-
-sql show dnodes
-if $rows != 4 then
- sleep 2000
- goto all_dnodes_ready
-endi
-print $data0_1 $data1_1 $data2_1 $data3_1 $data4_1
-print $data0_2 $data1_2 $data2_2 $data3_2 $data4_2
-print $data0_3 $data1_3 $data2_3 $data3_3 $data4_3
-print $data0_4 $data1_4 $data2_4 $data3_4 $data4_4
-#print $data0_5 $data1_5 $data2_5 $data3_5 $data4_5
-#print $data0_6 $data1_6 $data2_6 $data3_6 $data4_6
-$dnode1Status = $data4_1
-$dnode2Status = $data4_2
-$dnode3Status = $data4_3
-$dnode4Status = $data4_4
-#$dnode5Status = $data4_5
-
-if $dnode1Status != ready then
- sleep 2000
- goto all_dnodes_ready
-endi
-if $dnode2Status != ready then
- sleep 2000
- goto all_dnodes_ready
-endi
-if $dnode3Status != ready then
- sleep 2000
- goto all_dnodes_ready
-endi
-if $dnode4Status != ready then
- sleep 2000
- goto all_dnodes_ready
-endi
-
-sleep $sleepTimer #waiting del one replica data
# check using select
sql select count(*) from $stb
print data00 $data00
@@ -481,39 +312,31 @@ sql drop dnode $hostname2
sql drop dnode $hostname3
sleep $sleepTimer
-$loopCnt = 0
-wait_dnode23_dropped:
-$loopCnt = $loopCnt + 1
-if $loopCnt == 10 then
- return -1
-endi
+$x = 0
+step9:
+ $x = $x + 1
+ sleep 1000
+ if $x == 40 then
+ return -1
+ endi
sql show dnodes
if $rows != 2 then
- sleep 2000
- goto wait_dnode23_dropped
+ goto step9
endi
-print $data0_1 $data1_1 $data2_1 $data3_1 $data4_1
-print $data0_2 $data1_2 $data2_2 $data3_2 $data4_2
-print $data0_3 $data1_3 $data2_3 $data3_3 $data4_3
-print $data0_4 $data1_4 $data2_4 $data3_4 $data4_4
-#print $data0_5 $data1_5 $data2_5 $data3_5 $data4_5
-#print $data0_6 $data1_6 $data2_6 $data3_6 $data4_6
-$dnode1Status = $data4_1
-$dnode2Status = $data4_2
-$dnode3Status = $data4_3
-$dnode4Status = $data4_4
-if $dnode2Status != null then
- sleep 2000
- goto wait_dnode23_dropped
-endi
-if $dnode3Status != null then
- sleep 2000
- goto wait_dnode23_dropped
-endi
-if $dnode4Status != ready then
- return -1
+$x = 0
+a7:
+ $x = $x + 1
+ sleep 1000
+ if $x == 40 then
+ return -1
+ endi
+
+sql show vgroups
+print online vnodes $data03
+if $data03 != 1 then
+ goto a7
endi
sleep $sleepTimer #waiting move vnode from dnode3/dnode3 to dnode4
@@ -523,3 +346,13 @@ print data00 $data00
if $data00 != $totalRows then
return -1
endi
+
+
+system sh/exec.sh -n dnode1 -s stop -x SIGINT
+system sh/exec.sh -n dnode2 -s stop -x SIGINT
+system sh/exec.sh -n dnode3 -s stop -x SIGINT
+system sh/exec.sh -n dnode4 -s stop -x SIGINT
+system sh/exec.sh -n dnode5 -s stop -x SIGINT
+system sh/exec.sh -n dnode6 -s stop -x SIGINT
+system sh/exec.sh -n dnode7 -s stop -x SIGINT
+system sh/exec.sh -n dnode8 -s stop -x SIGINT
diff --git a/tests/script/unique/arbitrator/dn3_mn1_replica_change_dropDnod.sim b/tests/script/unique/arbitrator/dn3_mn1_replica_change_dropDnod.sim
index c36e9f015e..dd868e9eed 100644
--- a/tests/script/unique/arbitrator/dn3_mn1_replica_change_dropDnod.sim
+++ b/tests/script/unique/arbitrator/dn3_mn1_replica_change_dropDnod.sim
@@ -140,3 +140,11 @@ if $data00 != $totalRows then
return -1
endi
+system sh/exec.sh -n dnode1 -s stop -x SIGINT
+system sh/exec.sh -n dnode2 -s stop -x SIGINT
+system sh/exec.sh -n dnode3 -s stop -x SIGINT
+system sh/exec.sh -n dnode4 -s stop -x SIGINT
+system sh/exec.sh -n dnode5 -s stop -x SIGINT
+system sh/exec.sh -n dnode6 -s stop -x SIGINT
+system sh/exec.sh -n dnode7 -s stop -x SIGINT
+system sh/exec.sh -n dnode8 -s stop -x SIGINT
diff --git a/tests/script/unique/arbitrator/dn3_mn1_vnode_nomaster.sim b/tests/script/unique/arbitrator/dn3_mn1_vnode_nomaster.sim
index 53209b0d5a..b3bd853ffc 100644
--- a/tests/script/unique/arbitrator/dn3_mn1_vnode_nomaster.sim
+++ b/tests/script/unique/arbitrator/dn3_mn1_vnode_nomaster.sim
@@ -158,13 +158,15 @@ if $dnode4Vtatus != offline then
sleep 2000
goto wait_dnode4_vgroup_offline
endi
-if $dnode3Vtatus != unsynced then
+if $dnode3Vtatus != master then
sleep 2000
goto wait_dnode4_vgroup_offline
endi
-sql_error select count(*) from $stb
-sql_error insert into $tb values (now, 9988)
+sql select count(*) from $stb -x s31
+s31:
+#sql_error insert into $tb values (now, 9988) -x s32
+#s32:
print ============== step4: restart dnode2, then create database with replica 2, and create table, insert data
system sh/exec.sh -n dnode2 -s start
diff --git a/tests/script/unique/arbitrator/sync_replica3_alterTable_add.sim b/tests/script/unique/arbitrator/sync_replica3_alterTable_add.sim
index ba973cbe06..d4eb360efb 100644
--- a/tests/script/unique/arbitrator/sync_replica3_alterTable_add.sim
+++ b/tests/script/unique/arbitrator/sync_replica3_alterTable_add.sim
@@ -140,11 +140,9 @@ if $rows != 1 then
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 = $data5_2
-$dnode3Vtatus = $data7_2
+print $data00 $data01 $data02 $data03 $data04 $data05 $data06 $data07 $data08 $data09
+$dnode4Vtatus = $data05
+$dnode3Vtatus = $data07
if $dnode4Vtatus != offline then
sleep 2000
@@ -198,7 +196,3 @@ if $data00 != $totalRows then
sleep 2000
goto wait_table_altered
endi
-
-
-
-
diff --git a/tests/script/unique/arbitrator/sync_replica_alterTable_background_add.sim b/tests/script/unique/arbitrator/sync_replica_alterTable_background_add.sim
index 3867aa3699..46d5e34fcb 100644
--- a/tests/script/unique/arbitrator/sync_replica_alterTable_background_add.sim
+++ b/tests/script/unique/arbitrator/sync_replica_alterTable_background_add.sim
@@ -14,6 +14,9 @@ sql alter table $stb add column f1 float
$tblNum = $totalTableNum
$alterTblNum = 10
+sql reset query cache
+sleep 100
+
$i = 1
while $i < $alterTblNum
$tb = tb . $i
diff --git a/tests/script/unique/big/balance.sim b/tests/script/unique/big/balance.sim
index 91a7c538d2..f20939d458 100644
--- a/tests/script/unique/big/balance.sim
+++ b/tests/script/unique/big/balance.sim
@@ -21,7 +21,6 @@ system sh/cfg.sh -n dnode5 -c maxTablesPerVnode -v 1000
print =============== prepare data
system sh/exec.sh -n dnode1 -s start
-sleep 3000
sql connect
$i = 0
@@ -92,8 +91,8 @@ system sh/exec.sh -n dnode2 -s start
$x = 0
show1:
$x = $x + 1
- sleep 3000
- if $x == 10 then
+ sleep 1000
+ if $x == 30 then
return -1
endi
@@ -108,7 +107,7 @@ if $data2_2 != 2 then
endi
sql reset query cache
-sleep 1000
+sleep 100
sql select count(*) from t10
print select count(*) from t10 $data00 expect $rowNum
@@ -143,7 +142,6 @@ endi
print ========== step2
sql create dnode $hostname3
system sh/exec.sh -n dnode3 -s start
-sleep 10000
print ========== step3
sql drop dnode $hostname2
@@ -151,8 +149,8 @@ sql drop dnode $hostname2
$x = 0
show3:
$x = $x + 1
- sleep 3000
- if $x == 10 then
+ sleep 1000
+ if $x == 30 then
return -1
endi
@@ -171,10 +169,9 @@ if $data2_3 != 2 then
endi
system sh/exec.sh -n dnode2 -s stop -x SIGINT
-sleep 5000
sql reset query cache
-sleep 1000
+sleep 100
sql select count(*) from t10
print select count(*) from t10 $data00 expect $rowNum
@@ -212,8 +209,8 @@ sql drop dnode $hostname3
$x = 0
show4:
$x = $x + 1
- sleep 3000
- if $x == 10 then
+ sleep 1000
+ if $x == 30 then
return -1
endi
@@ -228,10 +225,9 @@ if $data2_3 != null then
endi
system sh/exec.sh -n dnode3 -s stop -x SIGINT
-sleep 5000
sql reset query cache
-sleep 1000
+sleep 100
sql select count(*) from t10
print select count(*) from t10 $data00 expect $rowNum
@@ -267,14 +263,31 @@ print ========== step5
system sh/exec.sh -n dnode4 -s start
sql create dnode $hostname4
-sleep 3000
+$x = 0
+step5:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
+sql show dnodes
+print dnode1 $data4_1
+print dnode2 $data4_2
+print dnode3 $data4_3
+print dnode4 $data4_4
+
+if $data4_4 != ready then
+ goto step5
+endi
+
sql alter database db replica 2
$x = 0
show5:
$x = $x + 1
- sleep 3000
- if $x == 10 then
+ sleep 1000
+ if $x == 30 then
return -1
endi
@@ -289,7 +302,7 @@ if $data2_4 != 4 then
endi
sql reset query cache
-sleep 1000
+sleep 100
sql select count(*) from t10
print select count(*) from t10 $data00 expect $rowNum
@@ -321,16 +334,14 @@ if $data00 != $totalNum then
goto show5
endi
-
print ========== step6
-sleep 3000
sql alter database db replica 1
$x = 0
show6:
$x = $x + 1
- sleep 3000
- if $x == 10 then
+ sleep 1000
+ if $x == 30 then
return -1
endi
@@ -345,7 +356,7 @@ if $data2_4 != 2 then
endi
sql reset query cache
-sleep 1000
+sleep 100
sql select count(*) from t10
print select count(*) from t10 $data00 expect $rowNum
diff --git a/tests/script/unique/big/tcp.sim b/tests/script/unique/big/tcp.sim
index 38cb667ec0..3c5cf92c7f 100644
--- a/tests/script/unique/big/tcp.sim
+++ b/tests/script/unique/big/tcp.sim
@@ -15,7 +15,6 @@ system sh/cfg.sh -n dnode1 -c httpDebugFlag -v 135
system sh/cfg.sh -n dnode1 -c debugFlag -v 131
system sh/exec.sh -n dnode1 -s start
-sleep 3000
sql connect
print ======================== dnode1 start
@@ -52,7 +51,7 @@ while $i < $tbNum
endw
$i = 0
-while $i < 10
+while $i < 5
print =============== step3 $i
sql select count(*) from $mt
print ===> $data00 $data01
@@ -83,7 +82,7 @@ while $i < $tbNum
endw
$i = 0
-while $i < 10
+while $i < 5
print =============== step5 $i
sql select count(*) from $mt where tgcol < 20200
print ===> $data00 $data01
diff --git a/tests/script/unique/cluster/balance1.sim b/tests/script/unique/cluster/balance1.sim
index ec0c58d416..c98687a81c 100644
--- a/tests/script/unique/cluster/balance1.sim
+++ b/tests/script/unique/cluster/balance1.sim
@@ -84,16 +84,14 @@ endi
print ============================== step2
print ========= start dnode2
-sleep 2000
sql create dnode $hostname2
system sh/exec.sh -n dnode2 -s start
-sleep 5000
$x = 0
show2:
$x = $x + 1
- sleep 2000
- if $x == 20 then
+ sleep 1000
+ if $x == 40 then
return -1
endi
sql show dnodes -x show2
@@ -129,13 +127,12 @@ sql insert into c_b1_t3 values(1520000024031, 31)
print ============================== step4
print ========= drop dnode2
sql drop dnode $hostname2
-sleep 9000
$x = 0
show4:
$x = $x + 1
- sleep 2000
- if $x == 20 then
+ sleep 1000
+ if $x == 40 then
return -1
endi
sql show dnodes -x show4
@@ -164,16 +161,14 @@ print dnode4 ==> $dnode4Role
print ============================== step5
print ========= add dnode2
system sh/exec.sh -n dnode2 -s stop -x SIGINT
-sleep 5000
system sh/exec.sh -n dnode3 -s start
sql create dnode $hostname3
-sleep 9000
$x = 0
show5:
$x = $x + 1
- sleep 2000
- if $x == 20 then
+ sleep 1000
+ if $x == 40 then
return -1
endi
sql show dnodes -x show5
@@ -212,13 +207,12 @@ sql_error create dnode $hostname1
print ============================== step8
sql drop dnode $hostname3
-sleep 15000
$x = 0
show8:
$x = $x + 1
- sleep 2000
- if $x == 30 then
+ sleep 1000
+ if $x == 40 then
return -1
endi
sql show dnodes -x show8
@@ -253,13 +247,12 @@ endi
print ============================== step9
sql create dnode $hostname4
system sh/exec.sh -n dnode4 -s start
-sleep 9000
$x = 0
show9:
$x = $x + 1
- sleep 2000
- if $x == 30 then
+ sleep 1000
+ if $x == 40 then
return -1
endi
sql show dnodes -x show9
@@ -302,8 +295,8 @@ sql insert into c_b1_t4 values(1520000024041, 41)
$x = 0
show10:
$x = $x + 1
- sleep 2000
- if $x == 30 then
+ sleep 1000
+ if $x == 40 then
return -1
endi
sql show dnodes -x show10
@@ -335,7 +328,23 @@ sql_error create table c_b1_t5 (t timestamp, i int) -x error3
print ============================== step13
sql create dnode $hostname5
system sh/exec.sh -n dnode5 -s start
-sleep 9000
+$x = 0
+step13:
+ $x = $x + 1
+ sleep 1000
+ if $x == 40 then
+ return -1
+ endi
+sql show dnodes
+print dnode1 $data4_1
+print dnode2 $data4_2
+print dnode3 $data4_3
+print dnode4 $data4_4
+print dnode5 $data4_5
+
+if $data4_5 != ready then
+ goto step13
+endi
sql show mnodes
$dnode1Role = $data2_1
@@ -371,19 +380,35 @@ $dnode5Vnodes = $data2_5
print dnode5 $dnode2Vnodes
if $dnode1Vnodes != 2 then
- return -1
+ goto step13
endi
if $dnode4Vnodes != 2 then
- return -1
+ goto step13
endi
if $dnode5Vnodes != 2 then
- return -1
+ goto step13
endi
print ============================== step14
sql create dnode $hostname6
system sh/exec.sh -n dnode6 -s start
-sleep 15000
+$x = 0
+step14:
+ $x = $x + 1
+ sleep 1000
+ if $x == 40 then
+ return -1
+ endi
+sql show dnodes
+print dnode1 $data4_1
+print dnode2 $data4_2
+print dnode3 $data4_3
+print dnode4 $data4_4
+print dnode4 $data4_5
+
+if $data4_6 != ready then
+ goto step14
+endi
sql create database c_b1_d7
sql use c_b1_d7
@@ -406,7 +431,7 @@ sql insert into c_b1_t8 values(1520000024081, 81)
$x = 0
show14:
$x = $x + 1
- sleep 2000
+ sleep 1000
if $x == 30 then
return -1
endi
@@ -440,7 +465,7 @@ print ============================== step17
print ========= check data
sql reset query cache
-sleep 1000
+sleep 100
sql use c_b1_d1
sql select * from c_b1_d1.c_b1_t1
diff --git a/tests/script/unique/cluster/balance2.sim b/tests/script/unique/cluster/balance2.sim
index b8477965c6..ffd13445ed 100644
--- a/tests/script/unique/cluster/balance2.sim
+++ b/tests/script/unique/cluster/balance2.sim
@@ -50,12 +50,48 @@ print ========= start dnode1
system sh/exec.sh -n dnode1 -s start
sql connect
-sleep 4001
sql create dnode $hostname2
sql create dnode $hostname3
system sh/exec.sh -n dnode2 -s start
system sh/exec.sh -n dnode3 -s start
-sleep 4001
+$x = 0
+step1:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
+sql show dnodes
+print dnode1 $data4_1
+print dnode2 $data4_2
+print dnode3 $data4_3
+print dnode4 $data4_4
+
+if $data4_1 != ready then
+ goto step1
+endi
+if $data4_2 != ready then
+ goto step1
+endi
+if $data4_3 != ready then
+ goto step1
+endi
+
+sql show mnodes
+print mnode1 $data2_1
+print mnode1 $data2_2
+print mnode1 $data2_3
+if $data2_1 != master then
+ goto step1
+endi
+if $data2_2 != slave then
+ goto step1
+endi
+if $data2_3 != slave then
+ goto step1
+endi
+
sql create database c_b2_d1 replica 2
sql use c_b2_d1
@@ -112,13 +148,12 @@ endi
print ============================== step2
print ========= drop dnode2
sql drop dnode $hostname2
-sleep 9000
$x = 0
show2:
$x = $x + 1
- sleep 3000
- if $x == 20 then
+ sleep 1000
+ if $x == 30 then
return -1
endi
sql show dnodes -x show2
@@ -155,13 +190,12 @@ print ============================== step3
print ========= start dnode4
sql create dnode $hostname4
system sh/exec.sh -n dnode4 -s start
-sleep 10000
$x = 0
show3:
$x = $x + 1
- sleep 3000
- if $x == 20 then
+ sleep 1000
+ if $x == 30 then
return -1
endi
sql show dnodes -x show3
@@ -209,13 +243,12 @@ endi
print ============================== step4
print ========= drop dnode3
sql drop dnode $hostname3
-sleep 9000
$x = 0
show4:
$x = $x + 1
- sleep 3000
- if $x == 20 then
+ sleep 1000
+ if $x == 40 then
return -1
endi
sql show dnodes -x show4
@@ -266,12 +299,11 @@ print ============================== step5
print ========= start dnode3
sql create dnode $hostname5
system sh/exec.sh -n dnode5 -s start
-sleep 9000
$x = 0
show5:
$x = $x + 1
- sleep 2000
+ sleep 1000
if $x == 30 then
return -1
endi
@@ -304,7 +336,7 @@ print dnode5 ==> $dnode5Role
print ============================== step6
system sh/exec.sh -n dnode1 -s stop -x SIGINT
print stop dnode1 and sleep 10000
-sleep 10000
+sleep 5000
sql drop dnode $hostname1
print drop dnode1 and sleep 9000
@@ -364,7 +396,7 @@ print ============================== step12
print ========= check data
sql reset query cache
-sleep 1000
+sleep 100
sql select * from c_b2_d1.c_b2_t1 order by t desc
print $data01 $data11 $data21 $data31 $data41
diff --git a/tests/script/unique/cluster/balance3.sim b/tests/script/unique/cluster/balance3.sim
index e3b8125d8c..c2e9a84514 100644
--- a/tests/script/unique/cluster/balance3.sim
+++ b/tests/script/unique/cluster/balance3.sim
@@ -7,7 +7,6 @@ system sh/deploy.sh -n dnode4 -i 4
system sh/deploy.sh -n dnode5 -i 5
system sh/deploy.sh -n dnode6 -i 6
system sh/deploy.sh -n dnode7 -i 7
-system sh/deploy.sh -n dnode8 -i 8
system sh/cfg.sh -n dnode1 -c numOfMnodes -v 3
system sh/cfg.sh -n dnode2 -c numOfMnodes -v 3
@@ -16,7 +15,6 @@ system sh/cfg.sh -n dnode4 -c numOfMnodes -v 3
system sh/cfg.sh -n dnode5 -c numOfMnodes -v 3
system sh/cfg.sh -n dnode6 -c numOfMnodes -v 3
system sh/cfg.sh -n dnode7 -c numOfMnodes -v 3
-system sh/cfg.sh -n dnode8 -c numOfMnodes -v 3
system sh/cfg.sh -n dnode1 -c mnodeEqualVnodeNum -v 0
system sh/cfg.sh -n dnode2 -c mnodeEqualVnodeNum -v 0
@@ -25,7 +23,6 @@ system sh/cfg.sh -n dnode4 -c mnodeEqualVnodeNum -v 0
system sh/cfg.sh -n dnode5 -c mnodeEqualVnodeNum -v 0
system sh/cfg.sh -n dnode6 -c mnodeEqualVnodeNum -v 0
system sh/cfg.sh -n dnode7 -c mnodeEqualVnodeNum -v 0
-system sh/cfg.sh -n dnode8 -c mnodeEqualVnodeNum -v 0
system sh/cfg.sh -n dnode1 -c wallevel -v 1
system sh/cfg.sh -n dnode2 -c wallevel -v 1
@@ -34,19 +31,52 @@ system sh/cfg.sh -n dnode4 -c wallevel -v 1
system sh/cfg.sh -n dnode5 -c wallevel -v 1
system sh/cfg.sh -n dnode6 -c wallevel -v 1
system sh/cfg.sh -n dnode7 -c wallevel -v 1
-system sh/cfg.sh -n dnode8 -c wallevel -v 1
print ============== step1
print ========= start dnode1
system sh/exec.sh -n dnode1 -s start
sql connect
-sleep 2001
-
sql create dnode $hostname2
sql create dnode $hostname3
system sh/exec.sh -n dnode2 -s start
system sh/exec.sh -n dnode3 -s start
-sleep 3001
+
+$x = 0
+step1:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
+sql show dnodes
+print dnode1 $data4_1
+print dnode2 $data4_2
+print dnode3 $data4_3
+
+if $data4_1 != ready then
+ goto step1
+endi
+if $data4_2 != ready then
+ goto step1
+endi
+if $data4_3 != ready then
+ goto step1
+endi
+
+sql show mnodes
+print mnode1 $data2_1
+print mnode1 $data2_2
+print mnode1 $data2_3
+if $data2_1 != master then
+ goto step1
+endi
+if $data2_2 != slave then
+ goto step1
+endi
+if $data2_3 != slave then
+ goto step1
+endi
sql create database c_b3_d1 replica 3
sql use c_b3_d1
@@ -89,8 +119,6 @@ $dnode2Vnodes = $data2_2
print dnode2 $dnode2Vnodes
$dnode3Vnodes = $data2_3
print dnode3 $dnode3Vnodes
-$dnode4Vnodes = $data2_4
-print dnode4 $dnode4Vnodes
if $dnode1Vnodes != 3 then
goto show1
@@ -101,30 +129,22 @@ endi
if $dnode3Vnodes != 3 then
goto show1
endi
-if $dnode4Vnodes != null then
- goto show1
-endi
sql show mnodes
print dnode1 ==> $data2_1
print dnode2 ==> $data2_2
print dnode3 ==> $data2_3
-print dnode4 ==> $data2_4
-print dnode5 ==> $data2_5
-print dnode6 ==> $data2_6
-print dnode7 ==> $data2_7
print ============================== step2
print ========= start dnode4
sql create dnode $hostname4
system sh/exec.sh -n dnode4 -s start
-sleep 9000
$x = 0
show2:
$x = $x + 1
- sleep 2000
- if $x == 20 then
+ sleep 1000
+ if $x == 40 then
return -1
endi
sql show dnodes -x show2
@@ -145,21 +165,16 @@ sql show mnodes
print dnode1 ==> $data2_1
print dnode2 ==> $data2_2
print dnode3 ==> $data2_3
-print dnode4 ==> $data2_4
-print dnode5 ==> $data2_5
-print dnode6 ==> $data2_6
-print dnode7 ==> $data2_7
print ============================== step3
print ========= drop dnode2
sql drop dnode $hostname2
-sleep 9000
$x = 0
show3:
$x = $x + 1
- sleep 2000
- if $x == 20 then
+ sleep 1000
+ if $x == 40 then
return -1
endi
sql show dnodes -x show3
@@ -189,25 +204,21 @@ sql show mnodes
print dnode1 ==> $data2_1
print dnode2 ==> $data2_2
print dnode3 ==> $data2_3
-print dnode4 ==> $data2_4
-print dnode5 ==> $data2_5
-print dnode6 ==> $data2_6
-print dnode7 ==> $data2_7
system sh/exec.sh -n dnode2 -s stop -x SIGINT
print ============================== step4
sql create dnode $hostname5
system sh/exec.sh -n dnode5 -s start
-sleep 10000
$x = 0
show4:
$x = $x + 1
- sleep 2000
- if $x == 20 then
+ sleep 1000
+ if $x == 40 then
return -1
endi
+
sql show dnodes -x show4
$dnode1Vnodes = $data2_1
print dnode1 $dnode1Vnodes
@@ -228,8 +239,10 @@ print dnode2 ==> $data2_2
print dnode3 ==> $data2_3
print dnode4 ==> $data2_4
print dnode5 ==> $data2_5
-print dnode6 ==> $data2_6
-print dnode7 ==> $data2_7
+
+if $data2_4 != slave then
+ goto show4
+endi
print ============================== step5
print ========= drop dnode3
@@ -239,8 +252,8 @@ sleep 9000
$x = 0
show5:
$x = $x + 1
- sleep 2000
- if $x == 20 then
+ sleep 1000
+ if $x == 40 then
return -1
endi
sql show dnodes -x show5
@@ -277,16 +290,19 @@ print dnode5 ==> $data2_5
print dnode6 ==> $data2_6
print dnode7 ==> $data2_7
+if $data2_5 != slave then
+ goto show5
+endi
+
print ============================== step6
sql create dnode $hostname6
system sh/exec.sh -n dnode6 -s start
-sleep 9000
$x = 0
show6:
$x = $x + 1
- sleep 2000
- if $x == 20 then
+ sleep 1000
+ if $x == 40 then
return -1
endi
sql show dnodes -x show6
@@ -299,6 +315,15 @@ print dnode5 $dnode5Vnodes
$dnode6Vnodes = $data2_6
print dnode6 $dnode6Vnodes
+if $dnode1Vnodes != 2 then
+ goto show6
+endi
+if $dnode4Vnodes != 2 then
+ goto show6
+endi
+if $dnode5Vnodes != 3 then
+ goto show6
+endi
if $dnode6Vnodes != 2 then
goto show6
endi
@@ -315,13 +340,12 @@ print dnode7 ==> $data2_7
print ============================== step7
print ========= drop dnode4
sql drop dnode $hostname4
-sleep 9000
$x = 0
show7:
$x = $x + 1
- sleep 2000
- if $x == 20 then
+ sleep 1000
+ if $x == 40 then
return -1
endi
sql show dnodes -x show7
@@ -357,16 +381,19 @@ print dnode5 ==> $data2_5
print dnode6 ==> $data2_6
print dnode7 ==> $data2_7
+if $data2_6 != slave then
+ goto show7
+endi
+
print ============================== step8
sql create dnode $hostname7
system sh/exec.sh -n dnode7 -s start
-sleep 9000
$x = 0
show8:
$x = $x + 1
- sleep 2000
- if $x == 20 then
+ sleep 1000
+ if $x == 40 then
return -1
endi
sql show dnodes -x show8
@@ -379,6 +406,15 @@ print dnode6 $dnode6Vnodes
$dnode7Vnodes = $data2_7
print dnode7 $dnode7Vnodes
+if $dnode1Vnodes != 2 then
+ goto show8
+endi
+if $dnode5Vnodes != 2 then
+ goto show8
+endi
+if $dnode6Vnodes != 3 then
+ goto show8
+endi
if $dnode7Vnodes != 2 then
goto show8
endi
@@ -393,47 +429,17 @@ print dnode6 ==> $data2_6
print dnode7 ==> $data2_7
print ============================== step9
-print ========= drop dnode1
system sh/exec.sh -n dnode1 -s stop -x SIGINT
-print stop dnode1 and sleep 10000
-sleep 10000
-
-sql drop dnode $hostname1
-print drop dnode1 and sleep 9000
-sleep 9000
-
-sql show mnodes
-$dnode1Role = $data2_1
-$dnode4Role = $data2_4
-$dnode5Role = $data2_5
-print dnode1 ==> $data2_1
-print dnode2 ==> $data2_2
-print dnode3 ==> $data2_3
-print dnode4 ==> $data2_4
-print dnode5 ==> $data2_5
-print dnode6 ==> $data2_6
-print dnode7 ==> $data2_7
-
-if $dnode1Role != offline then
- return -1
-endi
-
-print ============================== step9.1
-sleep 2000
-system sh/exec.sh -n dnode1 -s start
$x = 0
show9:
$x = $x + 1
- sleep 2000
- if $x == 20 then
+ sleep 1000
+ if $x == 40 then
return -1
endi
+sql show mnodes -x show9
-sql show mnodes
-$dnode1Role = $data2_1
-$dnode4Role = $data2_4
-$dnode5Role = $data2_5
print dnode1 ==> $data2_1
print dnode2 ==> $data2_2
print dnode3 ==> $data2_3
@@ -442,7 +448,60 @@ print dnode5 ==> $data2_5
print dnode6 ==> $data2_6
print dnode7 ==> $data2_7
-sql show dnodes -x show9
+if $data2_1 != offline then
+ goto show9
+endi
+if $data2_5 != master then
+ goto show9
+endi
+if $data2_6 != slave then
+ goto show9
+endi
+
+print ============================== step10
+sql drop dnode $hostname1
+$x = 0
+show10:
+ $x = $x + 1
+ sleep 1000
+ if $x == 40 then
+ return -1
+ endi
+sql show mnodes -x show10
+
+print dnode1 ==> $data2_1
+print dnode2 ==> $data2_2
+print dnode3 ==> $data2_3
+print dnode4 ==> $data2_4
+print dnode5 ==> $data2_5
+print dnode6 ==> $data2_6
+print dnode7 ==> $data2_7
+
+if $data2_1 != null then
+ goto show10
+endi
+if $data2_5 != master then
+ goto show10
+endi
+if $data2_6 != slave then
+ goto show10
+endi
+if $data2_7 != slave then
+ goto show10
+endi
+
+print ============================== step11
+system sh/exec.sh -n dnode1 -s start
+
+$x = 0
+show11:
+ $x = $x + 1
+ sleep 1000
+ if $x == 40 then
+ return -1
+ endi
+
+sql show dnodes -x show11
$dnode5Vnodes = $data2_5
print dnode5 $dnode5Vnodes
$dnode6Vnodes = $data2_6
@@ -451,17 +510,16 @@ $dnode7Vnodes = $data2_7
print dnode7 $dnode7Vnodes
if $dnode5Vnodes != 3 then
- goto show9
+ goto show11
endi
if $dnode6Vnodes != 3 then
- goto show9
+ goto show11
endi
if $dnode7Vnodes != 3 then
- goto show9
+ goto show11
endi
system sh/exec.sh -n dnode1 -s stop -x SIGINT
-sleep 5000
sql show mnodes
print dnode1 ==> $data2_1
@@ -472,15 +530,13 @@ print dnode5 ==> $data2_5
print dnode6 ==> $data2_6
print dnode7 ==> $data2_7
-print ============================== step11
-print ========= add db4
-
+print ============================== step12
sql create database c_b3_d4 replica 3
sql use c_b3_d4
$x = 0
create4:
$x = $x + 1
- sleep 2000
+ sleep 1000
if $x == 20 then
return -1
endi
@@ -491,16 +547,14 @@ sql insert into c_b3_t4 values(1520000022043, 43)
sql insert into c_b3_t4 values(1520000023042, 42)
sql insert into c_b3_t4 values(1520000024041, 41)
-sleep 3000
-
$x = 0
-show11:
+show12:
$x = $x + 1
- sleep 2000
- if $x == 20 then
+ sleep 1000
+ if $x == 40 then
return -1
endi
-sql show dnodes -x show11
+sql show dnodes -x show12
$dnode5Vnodes = $data2_5
print dnode5 $dnode5Vnodes
$dnode6Vnodes = $data2_6
@@ -509,21 +563,18 @@ $dnode7Vnodes = $data2_7
print dnode7 $dnode7Vnodes
if $dnode5Vnodes != 4 then
- goto show11
+ goto show12
endi
if $dnode6Vnodes != 4 then
- goto show11
+ goto show12
endi
if $dnode7Vnodes != 4 then
- goto show11
+ goto show12
endi
-system sh/exec.sh -n dnode1 -s stop -x SIGINT
-sleep 5000
-
print ============================== step13
sql reset query cache
-sleep 1000
+sleep 200
print ========= check data
@@ -590,4 +641,3 @@ system sh/exec.sh -n dnode4 -s stop -x SIGINT
system sh/exec.sh -n dnode5 -s stop -x SIGINT
system sh/exec.sh -n dnode6 -s stop -x SIGINT
system sh/exec.sh -n dnode7 -s stop -x SIGINT
-system sh/exec.sh -n dnode8 -s stop -x SIGINT
diff --git a/tests/script/unique/cluster/vgroup100.sim b/tests/script/unique/cluster/vgroup100.sim
index 68a5bad6b3..656ed2ec44 100644
--- a/tests/script/unique/cluster/vgroup100.sim
+++ b/tests/script/unique/cluster/vgroup100.sim
@@ -17,7 +17,6 @@ system sh/cfg.sh -n dnode3 -c mnodeEqualVnodeNum -v 0
print ============================== step1
system sh/exec.sh -n dnode1 -s start
-sleep 2000
sql connect
print ============================== step2
@@ -27,8 +26,6 @@ system sh/exec.sh -n dnode2 -s start
sql create dnode $hostname3
system sh/exec.sh -n dnode3 -s start
-sleep 3000
-
$maxNum = 102
$maxNum = 12
@@ -92,13 +89,11 @@ print ============================== step5
system sh/exec.sh -n dnode1 -s stop -x SIGINT
system sh/exec.sh -n dnode2 -s stop -x SIGINT
system sh/exec.sh -n dnode3 -s stop -x SIGINT
-sleep 5000
print ============================== step6
system sh/exec.sh -n dnode1 -s start
system sh/exec.sh -n dnode2 -s start
system sh/exec.sh -n dnode3 -s start
-sleep 10000
print ============================== step7
diff --git a/tests/script/unique/db/delete.sim b/tests/script/unique/db/delete.sim
index fee47caadb..f84339be79 100644
--- a/tests/script/unique/db/delete.sim
+++ b/tests/script/unique/db/delete.sim
@@ -18,7 +18,6 @@ system sh/cfg.sh -n dnode3 -c maxTablesPerVnode -v 1000
print ========= start dnodes
system sh/exec.sh -n dnode1 -s start
-sleep 3000
sql connect
sql create dnode $hostname2
sql create dnode $hostname3
@@ -38,8 +37,6 @@ while $i < 2000
$i = $i + 1
endw
-sleep 2500
-
sql show db.vgroups
if $rows != 2 then
return -1
@@ -73,7 +70,6 @@ system sh/exec.sh -n dnode1 -s stop -x SIGINT
system sh/exec.sh -n dnode2 -s stop -x SIGINT
system sh/exec.sh -n dnode3 -s stop -x SIGINT
-sleep 5000
system sh/exec.sh -n dnode1 -s start
system sh/exec.sh -n dnode2 -s start
system sh/exec.sh -n dnode3 -s start
@@ -92,7 +88,6 @@ if $data2_1 != master then
goto step3
endi
-sleep 1000
system sh/exec.sh -n dnode1 -s stop -x SIGINT
system sh/exec.sh -n dnode2 -s stop -x SIGINT
diff --git a/tests/script/unique/db/delete_part.sim b/tests/script/unique/db/delete_part.sim
index fd92c160d9..682444e922 100644
--- a/tests/script/unique/db/delete_part.sim
+++ b/tests/script/unique/db/delete_part.sim
@@ -31,11 +31,29 @@ system sh/cfg.sh -n dnode4 -c maxTablesPerVnode -v 4
print ========= start dnodes
system sh/exec.sh -n dnode1 -s start
-sleep 3000
sql connect
sql create dnode $hostname2
system sh/exec.sh -n dnode2 -s start
+$x = 0
+step1:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
+sql show dnodes
+print dnode1 $data4_1
+print dnode2 $data4_2
+
+if $data4_1 != ready then
+ goto step1
+endi
+if $data4_2 != ready then
+ goto step1
+endi
+
$loop = 0
begin:
@@ -53,7 +71,6 @@ begin:
sql insert into t13 values(now, 1 )
sql create table t14 (ts timestamp, i int)
sql insert into t14 values(now, 1 )
- sleep 1200
sql create table t21 (ts timestamp, i int)
sql insert into t21 values(now, 1 )
@@ -63,7 +80,6 @@ begin:
sql insert into t23 values(now, 1 )
sql create table t24 (ts timestamp, i int)
sql insert into t24 values(now, 1 )
- sleep 1200
sql create table t31 (ts timestamp, i int)
sql insert into t31 values(now, 1 )
@@ -73,7 +89,6 @@ begin:
sql insert into t33 values(now, 1 )
sql create table t34 (ts timestamp, i int)
sql insert into t34 values(now, 1 )
- sleep 1200
sql create table t41 (ts timestamp, i int)
sql insert into t41 values(now, 1 )
@@ -83,7 +98,6 @@ begin:
sql insert into t43 values(now, 1 )
sql create table t44 (ts timestamp, i int)
sql insert into t44 values(now, 1 )
- sleep 1200
sql create table t51 (ts timestamp, i int)
sql insert into t51 values(now, 1 )
@@ -93,7 +107,6 @@ begin:
sql insert into t53 values(now, 1 )
sql create table t54 (ts timestamp, i int)
sql insert into t54 values(now, 1 )
- sleep 1200
sql create table t61 (ts timestamp, i int)
sql insert into t61 values(now, 1 )
@@ -103,7 +116,6 @@ begin:
sql insert into t63 values(now, 1 )
sql create table t64 (ts timestamp, i int)
sql insert into t64 values(now, 1 )
- sleep 1200
sql create table t71 (ts timestamp, i int)
sql insert into t71 values(now, 1 )
@@ -113,7 +125,6 @@ begin:
sql insert into t73 values(now, 1 )
sql create table t74 (ts timestamp, i int)
sql insert into t74 values(now, 1 )
- sleep 1200
sql create table t81 (ts timestamp, i int)
sql insert into t81 values(now, 1 )
@@ -123,7 +134,6 @@ begin:
sql insert into t83 values(now, 1 )
sql create table t84 (ts timestamp, i int)
sql insert into t84 values(now, 1 )
- sleep 1200
sql show dnodes
print dnode1 openVnodes $data2_1
@@ -138,29 +148,36 @@ begin:
print ======== step2 $loop
system sh/exec.sh -n dnode2 -s stop
- sleep 1000
print ==> drop database $db
sql drop database $db
print ======== step3 $loop
sleep 2000
system sh/exec.sh -n dnode2 -s start
- sleep 15000
- sql show dnodes
+
+ $x = 0
+ step3:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
+ sql show dnodes -x step3
print dnode1 openVnodes $data2_1 $data4_1
print dnode2 openVnodes $data2_2 $data4_2
if $data2_1 != 0 then
- return -1
+ goto step3
endi
if $data2_2 != 0 then
- return -1
+ goto step3
endi
if $data4_1 != ready then
- return -1
+ goto step3
endi
if $data4_2 != ready then
- return -1
+ goto step3
endi
print ===> test times : $loop
@@ -171,7 +188,7 @@ begin:
$loop = $loop + 1
sql reset query cache
- sleep 1000
+ sleep 100
goto begin
diff --git a/tests/script/unique/db/replica_add12.sim b/tests/script/unique/db/replica_add12.sim
index 62d7e9daa3..d46187e445 100644
--- a/tests/script/unique/db/replica_add12.sim
+++ b/tests/script/unique/db/replica_add12.sim
@@ -20,6 +20,11 @@ system sh/cfg.sh -n dnode2 -c mnodeEqualVnodeNum -v 4
system sh/cfg.sh -n dnode3 -c mnodeEqualVnodeNum -v 4
system sh/cfg.sh -n dnode4 -c mnodeEqualVnodeNum -v 4
+system sh/cfg.sh -n dnode1 -c balanceInterval -v 1
+system sh/cfg.sh -n dnode2 -c balanceInterval -v 1
+system sh/cfg.sh -n dnode3 -c balanceInterval -v 1
+system sh/cfg.sh -n dnode4 -c balanceInterval -v 1
+
print ========= start dnodes
system sh/exec.sh -n dnode1 -s start
sql connect
@@ -27,7 +32,43 @@ sql create dnode $hostname2
system sh/exec.sh -n dnode2 -s start
sql create dnode $hostname3
system sh/exec.sh -n dnode3 -s start
-sleep 3000
+
+$x = 0
+step1:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
+sql show dnodes
+print dnode1 $data4_1
+print dnode2 $data4_2
+print dnode3 $data4_3
+
+if $data4_1 != ready then
+ goto step1
+endi
+if $data4_2 != ready then
+ goto step1
+endi
+if $data4_3 != ready then
+ goto step1
+endi
+
+sql show mnodes
+print mnode1 $data2_1
+print mnode1 $data2_2
+print mnode1 $data2_3
+if $data2_1 != master then
+ goto step1
+endi
+if $data2_2 != null then
+ goto step1
+endi
+if $data2_3 != null then
+ goto step1
+endi
print ======== step1
sql create database d1 replica 1
@@ -65,8 +106,6 @@ if $rows != 1 then
return -1
endi
-sleep 2000
-
sql show dnodes
print dnode1 ==> openVnodes: $data2_1
print dnode2 ==> openVnodes: $data2_2
@@ -89,10 +128,40 @@ sql alter database d1 replica 2
sql alter database d2 replica 2
sql alter database d3 replica 2
sql alter database d4 replica 2
-sleep 10000
+
+$x = 0
+a1:
+ $x = $x + 1
+ sleep 1000
+ if $x == 40 then
+ return -1
+ endi
+
+sql show d1.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto a1
+endi
+
+sql show d2.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto a1
+endi
+
+sql show d3.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto a1
+endi
+
+sql show d4.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto a1
+endi
print ======== step3
-
sql show dnodes
print dnode1 ==> openVnodes: $data2_1
print dnode2 ==> openVnodes: $data2_2
@@ -115,7 +184,6 @@ sql insert into d1.t1 values(now, 2)
sql insert into d2.t2 values(now, 2)
sql insert into d3.t3 values(now, 2)
sql insert into d4.t4 values(now, 2)
-sleep 1000
sql select * from d1.t1
if $rows != 2 then
@@ -138,33 +206,54 @@ if $rows != 2 then
endi
sql reset query cache
-sleep 2000
+sleep 200
print ========= step5
system sh/exec.sh -n dnode2 -s stop -x SIGINT
-sleep 5000
-
-sql_error select * from d1.t1
-sql_error select * from d2.t2
-sql_error select * from d3.t3
-sql_error select * from d4.t4
-
-print ===== insert data
-
-sql_error insert into d1.t1 values(now, 3)
-sql_error insert into d2.t2 values(now, 3)
-sql_error insert into d3.t3 values(now, 3)
-sql_error insert into d4.t4 values(now, 3)
-sleep 1000
+sql select * from d1.t1 -x s51
+s51:
+#sql insert into d1.t1 values(now, 3) -x s52
+s52:
print ========= step6
system sh/exec.sh -n dnode2 -s start
-sleep 5000
-sql insert into d1.t1 values(now, 3)
-sql insert into d2.t2 values(now, 3)
-sql insert into d3.t3 values(now, 3)
-sql insert into d4.t4 values(now, 3)
+$x = 0
+step6:
+ $x = $x + 1
+ sleep 1000
+ if $x == 20 then
+ return -1
+ endi
+
+sql show d1.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto step6
+endi
+
+sql show d2.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto step6
+endi
+
+sql show d3.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto step6
+endi
+
+sql show d4.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto step6
+endi
+
+sql insert into d1.t1 values(now, 3) -x step6
+sql insert into d2.t2 values(now, 3) -x step6
+sql insert into d3.t3 values(now, 3) -x step6
+sql insert into d4.t4 values(now, 3) -x step6
sql select * from d1.t1
if $rows != 3 then
@@ -187,30 +276,52 @@ if $rows != 3 then
endi
print ========= step61
-
system sh/exec.sh -n dnode3 -s stop -x SIGINT
-sleep 5000
+#sql insert into d1.t1 values(now, 3) -x s61
+s61:
-sql_error insert into d1.t1 values(now, 3)
-sql_error insert into d2.t2 values(now, 3)
-sql_error insert into d3.t3 values(now, 3)
-sql_error insert into d4.t4 values(now, 3)
-sleep 1000
-
-sql_error select * from d1.t1
-sql_error select * from d2.t2
-sql_error select * from d3.t3
-sql_error select * from d4.t4
+sql select * from d2.t2 -x s62
+s62:
print ========= step7
system sh/exec.sh -n dnode3 -s start
-sleep 5000
-sql insert into d1.t1 values(now, 5)
-sql insert into d2.t2 values(now, 5)
-sql insert into d3.t3 values(now, 5)
-sql insert into d4.t4 values(now, 5)
-sleep 1000
+$x = 0
+step7:
+ $x = $x + 1
+ sleep 1000
+ if $x == 20 then
+ return -1
+ endi
+
+sql show d1.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto step7
+endi
+
+sql show d2.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto step7
+endi
+
+sql show d3.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto step7
+endi
+
+sql show d4.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto step7
+endi
+
+sql insert into d1.t1 values(now, 5) -x step7
+sql insert into d2.t2 values(now, 5) -x step7
+sql insert into d3.t3 values(now, 5) -x step7
+sql insert into d4.t4 values(now, 5) -x step7
sql select * from d1.t1
if $rows != 4 then
@@ -235,8 +346,4 @@ endi
system sh/exec.sh -n dnode1 -s stop -x SIGINT
system sh/exec.sh -n dnode2 -s stop -x SIGINT
system sh/exec.sh -n dnode3 -s stop -x SIGINT
-system sh/exec.sh -n dnode4 -s stop -x SIGINT
-system sh/exec.sh -n dnode5 -s stop -x SIGINT
-system sh/exec.sh -n dnode6 -s stop -x SIGINT
-system sh/exec.sh -n dnode7 -s stop -x SIGINT
-system sh/exec.sh -n dnode8 -s stop -x SIGINT
\ No newline at end of file
+system sh/exec.sh -n dnode4 -s stop -x SIGINT
\ No newline at end of file
diff --git a/tests/script/unique/db/replica_add13.sim b/tests/script/unique/db/replica_add13.sim
index 5d34440e3e..13a5c97832 100644
--- a/tests/script/unique/db/replica_add13.sim
+++ b/tests/script/unique/db/replica_add13.sim
@@ -20,6 +20,11 @@ system sh/cfg.sh -n dnode2 -c mnodeEqualVnodeNum -v 4
system sh/cfg.sh -n dnode3 -c mnodeEqualVnodeNum -v 4
system sh/cfg.sh -n dnode4 -c mnodeEqualVnodeNum -v 4
+system sh/cfg.sh -n dnode1 -c balanceInterval -v 1
+system sh/cfg.sh -n dnode2 -c balanceInterval -v 1
+system sh/cfg.sh -n dnode3 -c balanceInterval -v 1
+system sh/cfg.sh -n dnode4 -c balanceInterval -v 1
+
print ========= start dnodes
system sh/exec.sh -n dnode1 -s start
sql connect
@@ -29,7 +34,41 @@ sql create dnode $hostname3
system sh/exec.sh -n dnode3 -s start
sql create dnode $hostname4
system sh/exec.sh -n dnode4 -s start
-sleep 3000
+
+$x = 0
+step1:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
+sql show dnodes
+print dnode1 $data4_1
+print dnode2 $data4_2
+print dnode3 $data4_3
+print dnode4 $data4_4
+
+if $data4_1 != ready then
+ goto step1
+endi
+if $data4_2 != ready then
+ goto step1
+endi
+if $data4_3 != ready then
+ goto step1
+endi
+if $data4_4 != ready then
+ goto step1
+endi
+
+sql show mnodes
+print mnode1 $data2_1
+print mnode1 $data2_2
+print mnode1 $data2_3
+if $data2_1 != master then
+ goto step1
+endi
print ======== step1
sql create database d1 replica 1
@@ -46,7 +85,6 @@ sql insert into d1.t1 values(1589529000011, 1)
sql insert into d2.t2 values(1589529000021, 1)
sql insert into d3.t3 values(1589529000031, 1)
sql insert into d4.t4 values(1589529000041, 1)
-sleep 1000
sql select * from d1.t1
if $rows != 1 then
@@ -73,17 +111,40 @@ sql alter database d1 replica 3
sql alter database d2 replica 3
sql alter database d3 replica 3
sql alter database d4 replica 3
-sleep 10000
+
+$x = 0
+a1:
+ $x = $x + 1
+ sleep 1000
+ if $x == 40 then
+ return -1
+ endi
+
+sql show d1.vgroups
+print online vnodes $data03
+if $data03 != 3 then
+ goto a1
+endi
+
+sql show d2.vgroups
+print online vnodes $data03
+if $data03 != 3 then
+ goto a1
+endi
+
+sql show d3.vgroups
+print online vnodes $data03
+if $data03 != 3 then
+ goto a1
+endi
+
+sql show d4.vgroups
+print online vnodes $data03
+if $data03 != 3 then
+ goto a1
+endi
print ======== step3
-$x = 0
-show3:
- $x = $x + 1
- sleep 2000
- if $x == 10 then
- return -1
- endi
-
sql show dnodes
print dnode1 ==> openVnodes: $data2_1
print dnode2 ==> openVnodes: $data2_2
@@ -111,7 +172,6 @@ sql insert into d1.t1 values(1589529000012, 2)
sql insert into d2.t2 values(1589529000022, 2)
sql insert into d3.t3 values(1589529000032, 2)
sql insert into d4.t4 values(1589529000042, 2)
-sleep 1000
sql select * from d1.t1
if $rows != 2 then
@@ -135,15 +195,13 @@ endi
print ========= step5
sql reset query cache
-sleep 1000
+sleep 100
system sh/exec.sh -n dnode2 -s stop -x SIGINT
-sleep 5000
sql insert into d1.t1 values(1589529000013, 3)
sql insert into d2.t2 values(1589529000023, 3)
sql insert into d3.t3 values(1589529000033, 3)
sql insert into d4.t4 values(1589529000043, 3)
-sleep 1000
sql select * from d1.t1
if $rows != 3 then
@@ -167,15 +225,45 @@ endi
print ========= step6
system sh/exec.sh -n dnode2 -s start
-sleep 5000
+
+$x = 0
+step6:
+ $x = $x + 1
+ sleep 1000
+ if $x == 40 then
+ return -1
+ endi
+
+sql show d1.vgroups
+print online vnodes $data03
+if $data03 != 3 then
+ goto step6
+endi
+
+sql show d2.vgroups
+print online vnodes $data03
+if $data03 != 3 then
+ goto step6
+endi
+
+sql show d3.vgroups
+print online vnodes $data03
+if $data03 != 3 then
+ goto step6
+endi
+
+sql show d4.vgroups
+print online vnodes $data03
+if $data03 != 3 then
+ goto step6
+endi
+
system sh/exec.sh -n dnode3 -s stop -x SIGINT
-sleep 5000
sql insert into d1.t1 values(1589529000014, 4)
sql insert into d2.t2 values(1589529000024, 4)
sql insert into d3.t3 values(1589529000034, 4)
sql insert into d4.t4 values(1589529000044, 4)
-sleep 1000
sql select * from d1.t1
print select * from d1.t1 $rows
@@ -203,15 +291,45 @@ endi
print ========= step7
system sh/exec.sh -n dnode3 -s start
-sleep 5000
+
+$x = 0
+step7:
+ $x = $x + 1
+ sleep 1000
+ if $x == 20 then
+ return -1
+ endi
+
+sql show d1.vgroups
+print online vnodes $data03
+if $data03 != 3 then
+ goto step7
+endi
+
+sql show d2.vgroups
+print online vnodes $data03
+if $data03 != 3 then
+ goto step7
+endi
+
+sql show d3.vgroups
+print online vnodes $data03
+if $data03 != 3 then
+ goto step7
+endi
+
+sql show d4.vgroups
+print online vnodes $data03
+if $data03 != 3 then
+ goto step7
+endi
+
system sh/exec.sh -n dnode4 -s stop -x SIGINT
-sleep 5000
sql insert into d1.t1 values(1589529000015, 5)
sql insert into d2.t2 values(1589529000025, 5)
sql insert into d3.t3 values(1589529000035, 5)
sql insert into d4.t4 values(1589529000045, 5)
-sleep 1000
sql select * from d1.t1
if $rows != 5 then
@@ -235,15 +353,45 @@ endi
print ========= step8
system sh/exec.sh -n dnode4 -s start
-sleep 5000
+
+$x = 0
+step8:
+ $x = $x + 1
+ sleep 1000
+ if $x == 40 then
+ return -1
+ endi
+
+sql show d1.vgroups
+print online vnodes $data03
+if $data03 != 3 then
+ goto step8
+endi
+
+sql show d2.vgroups
+print online vnodes $data03
+if $data03 != 3 then
+ goto step8
+endi
+
+sql show d3.vgroups
+print online vnodes $data03
+if $data03 != 3 then
+ goto step8
+endi
+
+sql show d4.vgroups
+print online vnodes $data03
+if $data03 != 3 then
+ goto step8
+endi
+
system sh/exec.sh -n dnode2 -s stop -x SIGINT
-sleep 5000
sql insert into d1.t1 values(1589529000016, 6)
sql insert into d2.t2 values(1589529000026, 6)
sql insert into d3.t3 values(1589529000036, 6)
sql insert into d4.t4 values(1589529000046, 6)
-sleep 1000
sql select * from d1.t1
if $rows != 6 then
@@ -268,8 +416,4 @@ endi
system sh/exec.sh -n dnode1 -s stop -x SIGINT
system sh/exec.sh -n dnode2 -s stop -x SIGINT
system sh/exec.sh -n dnode3 -s stop -x SIGINT
-system sh/exec.sh -n dnode4 -s stop -x SIGINT
-system sh/exec.sh -n dnode5 -s stop -x SIGINT
-system sh/exec.sh -n dnode6 -s stop -x SIGINT
-system sh/exec.sh -n dnode7 -s stop -x SIGINT
-system sh/exec.sh -n dnode8 -s stop -x SIGINT
\ No newline at end of file
+system sh/exec.sh -n dnode4 -s stop -x SIGINT
\ No newline at end of file
diff --git a/tests/script/unique/db/replica_add23.sim b/tests/script/unique/db/replica_add23.sim
index 9285f68137..ac0bd6d9d7 100644
--- a/tests/script/unique/db/replica_add23.sim
+++ b/tests/script/unique/db/replica_add23.sim
@@ -20,6 +20,11 @@ system sh/cfg.sh -n dnode2 -c mnodeEqualVnodeNum -v 4
system sh/cfg.sh -n dnode3 -c mnodeEqualVnodeNum -v 4
system sh/cfg.sh -n dnode4 -c mnodeEqualVnodeNum -v 4
+system sh/cfg.sh -n dnode1 -c balanceInterval -v 1
+system sh/cfg.sh -n dnode2 -c balanceInterval -v 1
+system sh/cfg.sh -n dnode3 -c balanceInterval -v 1
+system sh/cfg.sh -n dnode4 -c balanceInterval -v 1
+
print ========= start dnodes
system sh/exec.sh -n dnode1 -s start
sql connect
@@ -29,7 +34,42 @@ sql create dnode $hostname3
system sh/exec.sh -n dnode3 -s start
sql create dnode $hostname4
system sh/exec.sh -n dnode4 -s start
-sleep 3000
+
+
+$x = 0
+step1:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
+sql show dnodes
+print dnode1 $data4_1
+print dnode2 $data4_2
+print dnode3 $data4_3
+print dnode4 $data4_4
+
+if $data4_1 != ready then
+ goto step1
+endi
+if $data4_2 != ready then
+ goto step1
+endi
+if $data4_3 != ready then
+ goto step1
+endi
+if $data4_4 != ready then
+ goto step1
+endi
+
+sql show mnodes
+print mnode1 $data2_1
+print mnode1 $data2_2
+print mnode1 $data2_3
+if $data2_1 != master then
+ goto step1
+endi
print ======== step1
sql create database d1 replica 2
@@ -46,7 +86,6 @@ sql insert into d1.t1 values(1588262400001, 1)
sql insert into d2.t2 values(1588262400001, 1)
sql insert into d3.t3 values(1588262400001, 1)
sql insert into d4.t4 values(1588262400001, 1)
-sleep 1000
sql select * from d1.t1
if $rows != 1 then
@@ -73,17 +112,40 @@ sql alter database d1 replica 3
sql alter database d2 replica 3
sql alter database d3 replica 3
sql alter database d4 replica 3
-sleep 10000
-print ======== step3
$x = 0
-show3:
+a1:
$x = $x + 1
- sleep 2000
- if $x == 10 then
- return -1
+ sleep 1000
+ if $x == 40 then
+ return -1
endi
+sql show d1.vgroups
+print online vnodes $data03
+if $data03 != 3 then
+ goto a1
+endi
+
+sql show d2.vgroups
+print online vnodes $data03
+if $data03 != 3 then
+ goto a1
+endi
+
+sql show d3.vgroups
+print online vnodes $data03
+if $data03 != 3 then
+ goto a1
+endi
+
+sql show d4.vgroups
+print online vnodes $data03
+if $data03 != 3 then
+ goto a1
+endi
+
+print ======== step3
sql show dnodes
print dnode1 ==> openVnodes: $data2_1
print dnode2 ==> openVnodes: $data2_2
@@ -111,7 +173,6 @@ sql insert into d1.t1 values(1588262400002, 2)
sql insert into d2.t2 values(1588262400002, 2)
sql insert into d3.t3 values(1588262400002, 2)
sql insert into d4.t4 values(1588262400002, 2)
-sleep 1000
sql select * from d1.t1
if $rows != 2 then
@@ -134,17 +195,14 @@ if $rows != 2 then
endi
sql reset query cache
-sleep 1000
+sleep 100
print ========= step5
system sh/exec.sh -n dnode2 -s stop -x SIGINT
-sleep 5000
-
sql insert into d1.t1 values(1588262400003, 3)
sql insert into d2.t2 values(1588262400003, 3)
sql insert into d3.t3 values(1588262400003, 3)
sql insert into d4.t4 values(1588262400003, 3)
-sleep 1000
sql select * from d1.t1
if $rows != 3 then
@@ -168,15 +226,45 @@ endi
print ========= step6
system sh/exec.sh -n dnode2 -s start
-sleep 5000
+
+$x = 0
+step6:
+ $x = $x + 1
+ sleep 1000
+ if $x == 20 then
+ return -1
+ endi
+
+sql show d1.vgroups
+print online vnodes $data03
+if $data03 != 3 then
+ goto step6
+endi
+
+sql show d2.vgroups
+print online vnodes $data03
+if $data03 != 3 then
+ goto step6
+endi
+
+sql show d3.vgroups
+print online vnodes $data03
+if $data03 != 3 then
+ goto step6
+endi
+
+sql show d4.vgroups
+print online vnodes $data03
+if $data03 != 3 then
+ goto step6
+endi
+
system sh/exec.sh -n dnode3 -s stop -x SIGINT
-sleep 5000
sql insert into d1.t1 values(1588262400004, 4)
sql insert into d2.t2 values(1588262400004, 4)
sql insert into d3.t3 values(1588262400004, 4)
sql insert into d4.t4 values(1588262400004, 4)
-sleep 1000
sql select * from d1.t1
if $rows != 4 then
@@ -200,15 +288,45 @@ endi
print ========= step7
system sh/exec.sh -n dnode3 -s start
-sleep 5000
+
+$x = 0
+step7:
+ $x = $x + 1
+ sleep 1000
+ if $x == 20 then
+ return -1
+ endi
+
+sql show d1.vgroups
+print online vnodes $data03
+if $data03 != 3 then
+ goto step7
+endi
+
+sql show d2.vgroups
+print online vnodes $data03
+if $data03 != 3 then
+ goto step7
+endi
+
+sql show d3.vgroups
+print online vnodes $data03
+if $data03 != 3 then
+ goto step7
+endi
+
+sql show d4.vgroups
+print online vnodes $data03
+if $data03 != 3 then
+ goto step7
+endi
+
system sh/exec.sh -n dnode4 -s stop -x SIGINT
-sleep 5000
sql insert into d1.t1 values(1588262400005, 5)
sql insert into d2.t2 values(1588262400005, 5)
sql insert into d3.t3 values(1588262400005, 5)
sql insert into d4.t4 values(1588262400005, 5)
-sleep 1000
sql select * from d1.t1
if $rows != 5 then
@@ -232,15 +350,45 @@ endi
print ========= step8
system sh/exec.sh -n dnode4 -s start
-sleep 5000
+
+$x = 0
+step8:
+ $x = $x + 1
+ sleep 2000
+ if $x == 10 then
+ return -1
+ endi
+
+sql show d1.vgroups
+print online vnodes $data03
+if $data03 != 3 then
+ goto step8
+endi
+
+sql show d2.vgroups
+print online vnodes $data03
+if $data03 != 3 then
+ goto step8
+endi
+
+sql show d3.vgroups
+print online vnodes $data03
+if $data03 != 3 then
+ goto step8
+endi
+
+sql show d4.vgroups
+print online vnodes $data03
+if $data03 != 3 then
+ goto step8
+endi
+
system sh/exec.sh -n dnode2 -s stop -x SIGINT
-sleep 5000
sql insert into d1.t1 values(1588262400006, 6)
sql insert into d2.t2 values(1588262400006, 6)
sql insert into d3.t3 values(1588262400006, 6)
sql insert into d4.t4 values(1588262400006, 6)
-sleep 1000
sql select * from d1.t1
if $rows != 6 then
@@ -265,8 +413,4 @@ endi
system sh/exec.sh -n dnode1 -s stop -x SIGINT
system sh/exec.sh -n dnode2 -s stop -x SIGINT
system sh/exec.sh -n dnode3 -s stop -x SIGINT
-system sh/exec.sh -n dnode4 -s stop -x SIGINT
-system sh/exec.sh -n dnode5 -s stop -x SIGINT
-system sh/exec.sh -n dnode6 -s stop -x SIGINT
-system sh/exec.sh -n dnode7 -s stop -x SIGINT
-system sh/exec.sh -n dnode8 -s stop -x SIGINT
\ No newline at end of file
+system sh/exec.sh -n dnode4 -s stop -x SIGINT
\ No newline at end of file
diff --git a/tests/script/unique/db/replica_part.sim b/tests/script/unique/db/replica_part.sim
index 5c5f98a108..9880ec666c 100644
--- a/tests/script/unique/db/replica_part.sim
+++ b/tests/script/unique/db/replica_part.sim
@@ -14,6 +14,10 @@ system sh/cfg.sh -n dnode1 -c mnodeEqualVnodeNum -v 4
system sh/cfg.sh -n dnode2 -c mnodeEqualVnodeNum -v 4
system sh/cfg.sh -n dnode3 -c mnodeEqualVnodeNum -v 4
+system sh/cfg.sh -n dnode1 -c balanceInterval -v 1
+system sh/cfg.sh -n dnode2 -c balanceInterval -v 1
+system sh/cfg.sh -n dnode3 -c balanceInterval -v 1
+
print ========= start dnodes
system sh/exec.sh -n dnode1 -s start
sql connect
@@ -21,7 +25,38 @@ sql create dnode $hostname2
system sh/exec.sh -n dnode2 -s start
sql create dnode $hostname3
system sh/exec.sh -n dnode3 -s start
-sleep 3000
+
+$x = 0
+step1:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
+sql show dnodes
+print dnode1 $data4_1
+print dnode2 $data4_2
+print dnode3 $data4_3
+print dnode4 $data4_4
+
+if $data4_1 != ready then
+ goto step1
+endi
+if $data4_2 != ready then
+ goto step1
+endi
+if $data4_3 != ready then
+ goto step1
+endi
+
+sql show mnodes
+print mnode1 $data2_1
+print mnode1 $data2_2
+print mnode1 $data2_3
+if $data2_1 != master then
+ goto step1
+endi
print ======== step1
sql create database d1 replica 3
@@ -38,7 +73,6 @@ sql insert into d2.t2 values(now, 1)
sql insert into d1.t1 values(now, 1)
sql insert into d3.t3 values(now, 1)
sql insert into d4.t4 values(now, 1)
-sleep 1000
sql select * from d1.t1
if $rows != 1 then
@@ -61,24 +95,85 @@ if $rows != 1 then
endi
print ========= step2 alter db
-system sh/exec.sh -n dnode2 -s stop -x SIGINT
-sleep 5000
sql alter database d1 replica 2
sql alter database d2 replica 2
sql alter database d3 replica 2
sql alter database d4 replica 2
-sleep 5000
+
+$x = 0
+a1:
+ $x = $x + 1
+ sleep 1000
+ if $x == 40 then
+ return -1
+ endi
+
+sql show d1.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto a1
+endi
+
+sql show d2.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto a1
+endi
+
+sql show d3.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto a1
+endi
+
+sql show d4.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto a1
+endi
+
+system sh/exec.sh -n dnode2 -s stop -x SIGINT
print ========= step3
system sh/exec.sh -n dnode2 -s start
-sleep 10000
+
+$x = 0
+step3:
+ $x = $x + 1
+ sleep 1000
+ if $x == 20 then
+ return -1
+ endi
+
+sql show d1.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto step3
+endi
+
+sql show d2.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto step3
+endi
+
+sql show d3.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto step3
+endi
+
+sql show d4.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto step3
+endi
print ========= step4
sql insert into d1.t1 values(now, 2)
sql insert into d2.t2 values(now, 2)
sql insert into d3.t3 values(now, 2)
sql insert into d4.t4 values(now, 2)
-sleep 1000
sql select * from d1.t1
if $rows != 2 then
@@ -102,44 +197,104 @@ endi
print ========= step5
system sh/exec.sh -n dnode2 -s stop -x SIGINT
-sleep 5000
sql reset query cache
-sleep 1000
+sleep 100
sql insert into d1.t1 values(now, 3) -x s1
s1:
-sql insert into d2.t2 values(now, 3) -x s2
-s2:
-sql insert into d3.t3 values(now, 3) -x s3
-s3:
-sql insert into d4.t4 values(now, 3) -x s4
-s4:
+#sql insert into d2.t2 values(now, 3) -x s2
+#s2:
+#sql insert into d3.t3 values(now, 3) -x s3
+#s3:
+#sql insert into d4.t4 values(now, 3) -x s4
+#s4:
print ========= step6
system sh/exec.sh -n dnode2 -s start
-sleep 5000
-system sh/exec.sh -n dnode3 -s stop -x SIGINT
-sleep 5000
-sql insert into d1.t1 values(now, 4) -x s5
-s5:
+$x = 0
+step6:
+ $x = $x + 1
+ sleep 1000
+ if $x == 20 then
+ return -1
+ endi
+
+sql show d1.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto step6
+endi
+
+sql show d2.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto step6
+endi
+
+sql show d3.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto step6
+endi
+
+sql show d4.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto step6
+endi
+
+system sh/exec.sh -n dnode3 -s stop -x SIGINT
+
+#sql insert into d1.t1 values(now, 4) -x s5
+#s5:
sql insert into d2.t2 values(now, 4) -x s6
s6:
-sql insert into d3.t3 values(now, 4) -x s7
-s7:
-sql insert into d4.t4 values(now, 4) -x s8
-s8:
+#sql insert into d3.t3 values(now, 4) -x s7
+#s7:
+#sql insert into d4.t4 values(now, 4) -x s8
+#s8:
print ========= step7
system sh/exec.sh -n dnode3 -s start
-sleep 5000
+
+$x = 0
+step7:
+ $x = $x + 1
+ sleep 1000
+ if $x == 20 then
+ return -1
+ endi
+
+sql show d1.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto step7
+endi
+
+sql show d2.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto step7
+endi
+
+sql show d3.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto step7
+endi
+
+sql show d4.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto step7
+endi
sql insert into d1.t1 values(now, 5)
sql insert into d2.t2 values(now, 5)
sql insert into d3.t3 values(now, 5)
sql insert into d4.t4 values(now, 5)
-sleep 1000
sql select * from d1.t1
sql select * from d2.t2
@@ -148,9 +303,4 @@ sql select * from d4.t4
system sh/exec.sh -n dnode1 -s stop -x SIGINT
system sh/exec.sh -n dnode2 -s stop -x SIGINT
-system sh/exec.sh -n dnode3 -s stop -x SIGINT
-system sh/exec.sh -n dnode4 -s stop -x SIGINT
-system sh/exec.sh -n dnode5 -s stop -x SIGINT
-system sh/exec.sh -n dnode6 -s stop -x SIGINT
-system sh/exec.sh -n dnode7 -s stop -x SIGINT
-system sh/exec.sh -n dnode8 -s stop -x SIGINT
\ No newline at end of file
+system sh/exec.sh -n dnode3 -s stop -x SIGINT
\ No newline at end of file
diff --git a/tests/script/unique/db/replica_reduce21.sim b/tests/script/unique/db/replica_reduce21.sim
index 7fe7d9504a..d3a76485f8 100644
--- a/tests/script/unique/db/replica_reduce21.sim
+++ b/tests/script/unique/db/replica_reduce21.sim
@@ -14,12 +14,42 @@ system sh/cfg.sh -n dnode1 -c mnodeEqualVnodeNum -v 4
system sh/cfg.sh -n dnode2 -c mnodeEqualVnodeNum -v 4
system sh/cfg.sh -n dnode3 -c mnodeEqualVnodeNum -v 4
+system sh/cfg.sh -n dnode1 -c balanceInterval -v 1
+system sh/cfg.sh -n dnode2 -c balanceInterval -v 1
+system sh/cfg.sh -n dnode3 -c balanceInterval -v 1
+system sh/cfg.sh -n dnode4 -c balanceInterval -v 1
+
print ========= start dnodes
system sh/exec.sh -n dnode1 -s start
sql connect
sql create dnode $hostname2
system sh/exec.sh -n dnode2 -s start
-sleep 3000
+
+$x = 0
+step1:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
+sql show dnodes
+print dnode1 $data4_1
+print dnode2 $data4_2
+
+if $data4_1 != ready then
+ goto step1
+endi
+if $data4_2 != ready then
+ goto step1
+endi
+
+sql show mnodes
+print mnode1 $data2_1
+print mnode1 $data2_2
+if $data2_1 != master then
+ goto step1
+endi
print ======== step1
sql create database d1 replica 2
@@ -63,12 +93,25 @@ sql create database d5 replica 1
print ========= step3 alter d1
sql alter database d1 replica 1
-sleep 12000
+
+$x = 0
+a1:
+ $x = $x + 1
+ sleep 1000
+ if $x == 20 then
+ return -1
+ endi
+
+sql show d1.vgroups
+print online vnodes $data03
+if $data03 != 1 then
+ goto a1
+endi
+
print ========= step4 query d1
sql insert into d1.t1 values(now, 2)
sql select * from d1.t1
-sleep 1000
if $rows != 2 then
return -1
endi
@@ -77,22 +120,20 @@ print ========= step5 query d5
sql create table d5.t5 (ts timestamp, i int)
sql insert into d5.t5 values(now, 1);
sql select * from d5.t5
-sleep 1000
if $rows != 1 then
return -1
endi
return
print ========= step7 drop d1
sql drop database d1
-sleep 5000
-
sql reset query cache
+sleep 100
+
print ========= step8
sql insert into d5.t5 values(now, 2)
sql insert into d2.t2 values(now, 2)
sql insert into d3.t3 values(now, 2)
sql insert into d4.t4 values(now, 2)
-sleep 1000
sql select * from d5.t5
if $rows != 2 then
@@ -116,13 +157,11 @@ endi
print ======== step9 stop dnode2
system sh/exec.sh -n dnode2 -s stop -x SIGINT
-sleep 5000
sql insert into d5.t5 values(now, 3)
sql insert into d2.t2 values(now, 3)
sql insert into d3.t3 values(now, 3)
sql insert into d4.t4 values(now, 3)
-sleep 1000
sql select * from d5.t5
if $rows != 3 then
@@ -145,10 +184,4 @@ if $rows != 3 then
endi
system sh/exec.sh -n dnode1 -s stop -x SIGINT
-system sh/exec.sh -n dnode2 -s stop -x SIGINT
-system sh/exec.sh -n dnode3 -s stop -x SIGINT
-system sh/exec.sh -n dnode4 -s stop -x SIGINT
-system sh/exec.sh -n dnode5 -s stop -x SIGINT
-system sh/exec.sh -n dnode6 -s stop -x SIGINT
-system sh/exec.sh -n dnode7 -s stop -x SIGINT
-system sh/exec.sh -n dnode8 -s stop -x SIGINT
\ No newline at end of file
+system sh/exec.sh -n dnode2 -s stop -x SIGINT
\ No newline at end of file
diff --git a/tests/script/unique/db/replica_reduce31.sim b/tests/script/unique/db/replica_reduce31.sim
index cbe0417dbd..00a0bbfcb3 100644
--- a/tests/script/unique/db/replica_reduce31.sim
+++ b/tests/script/unique/db/replica_reduce31.sim
@@ -14,6 +14,11 @@ system sh/cfg.sh -n dnode1 -c mnodeEqualVnodeNum -v 4
system sh/cfg.sh -n dnode2 -c mnodeEqualVnodeNum -v 4
system sh/cfg.sh -n dnode3 -c mnodeEqualVnodeNum -v 4
+system sh/cfg.sh -n dnode1 -c balanceInterval -v 1
+system sh/cfg.sh -n dnode2 -c balanceInterval -v 1
+system sh/cfg.sh -n dnode3 -c balanceInterval -v 1
+system sh/cfg.sh -n dnode4 -c balanceInterval -v 1
+
print ========= start dnodes
system sh/exec.sh -n dnode1 -s start
sql connect
@@ -21,7 +26,38 @@ sql create dnode $hostname2
system sh/exec.sh -n dnode2 -s start
sql create dnode $hostname3
system sh/exec.sh -n dnode3 -s start
-sleep 3000
+
+$x = 0
+step1:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
+sql show dnodes
+print dnode1 $data4_1
+print dnode2 $data4_2
+print dnode3 $data4_3
+print dnode4 $data4_4
+
+if $data4_1 != ready then
+ goto step1
+endi
+if $data4_2 != ready then
+ goto step1
+endi
+if $data4_3 != ready then
+ goto step1
+endi
+
+sql show mnodes
+print mnode1 $data2_1
+print mnode1 $data2_2
+print mnode1 $data2_3
+if $data2_1 != master then
+ goto step1
+endi
print ======== step1
sql create database d1 replica 3
@@ -38,7 +74,6 @@ sql insert into d1.t1 values(now, 1)
sql insert into d2.t2 values(now, 1)
sql insert into d3.t3 values(now, 1)
sql insert into d4.t4 values(now, 1)
-sleep 1000
sql select * from d1.t1
if $rows != 1 then
@@ -68,23 +103,70 @@ sql alter database d1 replica 2
sql alter database d2 replica 2
sql alter database d3 replica 2
-sleep 8000
+$x = 0
+a2:
+ $x = $x + 1
+ sleep 1000
+ if $x == 40 then
+ return -1
+ endi
+
+sql show d1.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto a2
+endi
+
+sql show d2.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto a2
+endi
+
+sql show d3.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto a2
+endi
sql alter database d1 replica 1
sql alter database d2 replica 1
sql alter database d3 replica 1
-sleep 8000
+$x = 0
+a1:
+ $x = $x + 1
+ sleep 1000
+ if $x == 20 then
+ return -1
+ endi
+
+sql show d1.vgroups
+print online vnodes $data03
+if $data03 != 1 then
+ goto a1
+endi
+
+sql show d2.vgroups
+print online vnodes $data03
+if $data03 != 1 then
+ goto a1
+endi
+
+sql show d3.vgroups
+print online vnodes $data03
+if $data03 != 1 then
+ goto a1
+endi
print ========= step3
sql reset query cache
-sleep 1000
+sleep 100
sql insert into d1.t1 values(now, 2)
sql insert into d2.t2 values(now, 2)
sql insert into d3.t3 values(now, 2)
sql insert into d4.t4 values(now, 2)
-sleep 1000
sql select * from d1.t1
if $rows != 2 then
@@ -110,13 +192,37 @@ print ========= step4 alter db
sql alter database d1 replica 2
sql alter database d2 replica 2
sql alter database d3 replica 2
-sleep 8000
+
+$x = 0
+step4:
+ $x = $x + 1
+ sleep 1000
+ if $x == 40 then
+ return -1
+ endi
+
+sql show d1.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto step4
+endi
+
+sql show d2.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto step4
+endi
+
+sql show d3.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto step4
+endi
sql insert into d1.t1 values(now, 3)
sql insert into d2.t2 values(now, 3)
sql insert into d3.t3 values(now, 3)
sql insert into d4.t4 values(now, 3)
-sleep 1000
sql select * from d1.t1
if $rows != 3 then
@@ -140,10 +246,8 @@ endi
print ========= step4
system sh/exec.sh -n dnode2 -s stop -x SIGINT
-sleep 5000
-
sql reset query cache
-sleep 1000
+sleep 100
sql insert into d1.t1 values(now, 4) -x step1
step1:
@@ -156,9 +260,7 @@ step4:
print ========= step5
system sh/exec.sh -n dnode2 -s start
-sleep 5000
system sh/exec.sh -n dnode3 -s stop -x SIGINT
-sleep 5000
sql insert into d1.t1 values(now, 5) -x step5
step5:
@@ -171,13 +273,11 @@ step8:
print ========= step6
system sh/exec.sh -n dnode3 -s start
-sleep 5000
sql insert into d1.t1 values(now, 6)
sql insert into d2.t2 values(now, 6)
sql insert into d3.t3 values(now, 6)
sql insert into d4.t4 values(now, 6)
-sleep 1000
sql select * from d1.t1
sql select * from d2.t2
@@ -186,9 +286,4 @@ sql select * from d4.t4
system sh/exec.sh -n dnode1 -s stop -x SIGINT
system sh/exec.sh -n dnode2 -s stop -x SIGINT
-system sh/exec.sh -n dnode3 -s stop -x SIGINT
-system sh/exec.sh -n dnode4 -s stop -x SIGINT
-system sh/exec.sh -n dnode5 -s stop -x SIGINT
-system sh/exec.sh -n dnode6 -s stop -x SIGINT
-system sh/exec.sh -n dnode7 -s stop -x SIGINT
-system sh/exec.sh -n dnode8 -s stop -x SIGINT
\ No newline at end of file
+system sh/exec.sh -n dnode3 -s stop -x SIGINT
\ No newline at end of file
diff --git a/tests/script/unique/db/replica_reduce32.sim b/tests/script/unique/db/replica_reduce32.sim
index c453f16ce6..a5eb78dacb 100644
--- a/tests/script/unique/db/replica_reduce32.sim
+++ b/tests/script/unique/db/replica_reduce32.sim
@@ -14,6 +14,11 @@ system sh/cfg.sh -n dnode1 -c mnodeEqualVnodeNum -v 4
system sh/cfg.sh -n dnode2 -c mnodeEqualVnodeNum -v 4
system sh/cfg.sh -n dnode3 -c mnodeEqualVnodeNum -v 4
+system sh/cfg.sh -n dnode1 -c balanceInterval -v 1
+system sh/cfg.sh -n dnode2 -c balanceInterval -v 1
+system sh/cfg.sh -n dnode3 -c balanceInterval -v 1
+system sh/cfg.sh -n dnode4 -c balanceInterval -v 1
+
print ========= start dnodes
system sh/exec.sh -n dnode1 -s start
sql connect
@@ -21,7 +26,43 @@ sql create dnode $hostname2
system sh/exec.sh -n dnode2 -s start
sql create dnode $hostname3
system sh/exec.sh -n dnode3 -s start
-sleep 3000
+
+$x = 0
+step1:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
+sql show dnodes
+print dnode1 $data4_1
+print dnode2 $data4_2
+print dnode3 $data4_3
+
+if $data4_1 != ready then
+ goto step1
+endi
+if $data4_2 != ready then
+ goto step1
+endi
+if $data4_3 != ready then
+ goto step1
+endi
+
+sql show mnodes
+print mnode1 $data2_1
+print mnode1 $data2_2
+print mnode1 $data2_3
+if $data2_1 != master then
+ goto step1
+endi
+if $data2_2 != null then
+ goto step1
+endi
+if $data2_3 != null then
+ goto step1
+endi
print ======== step1
sql create database d1 replica 3
@@ -38,7 +79,6 @@ sql insert into d2.t2 values(now, 1)
sql insert into d1.t1 values(now, 1)
sql insert into d3.t3 values(now, 1)
sql insert into d4.t4 values(now, 1)
-sleep 1000
sql select * from d1.t1
if $rows != 1 then
@@ -65,14 +105,44 @@ sql alter database d1 replica 2
sql alter database d2 replica 2
sql alter database d3 replica 2
sql alter database d4 replica 2
-sleep 12000
+
+$x = 0
+a1:
+ $x = $x + 1
+ sleep 1000
+ if $x == 40 then
+ return -1
+ endi
+
+sql show d1.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto a1
+endi
+
+sql show d2.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto a1
+endi
+
+sql show d3.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto a1
+endi
+
+sql show d4.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto a1
+endi
print ========= step3
sql insert into d1.t1 values(now, 2)
sql insert into d2.t2 values(now, 2)
sql insert into d3.t3 values(now, 2)
sql insert into d4.t4 values(now, 2)
-sleep 1000
sql select * from d1.t1
if $rows != 2 then
@@ -95,40 +165,111 @@ if $rows != 2 then
endi
sql reset query cache
-sleep 1000
+sleep 200
print ========= step4
system sh/exec.sh -n dnode2 -s stop -x SIGINT
sleep 5000
-sql_error insert into d1.t1 values(now, 3)
-sql_error insert into d2.t2 values(now, 3)
-sql_error insert into d3.t3 values(now, 3)
-sql_error insert into d4.t4 values(now, 3)
+sql insert into d1.t1 values(now, 3) -x s41
+s41:
+sql insert into d2.t2 values(now, 3) -x s42
+s42:
+sql insert into d3.t3 values(now, 3) -x s43
+s43:
+sql insert into d4.t4 values(now, 3) -x s44
+s44:
-sql_error select * from d1.t1
-sql_error select * from d2.t2
-sql_error select * from d3.t3
-sql_error select * from d4.t4
+sql select * from d1.t1 -x s45
+s45:
+sql select * from d2.t2 -x s46
+s46:
+sql select * from d3.t3 -x s47
+s47:
+sql select * from d4.t4 -x s48
+s48:
print ========= step5
system sh/exec.sh -n dnode2 -s start
-sleep 5000
+$x = 0
+step5:
+ $x = $x + 1
+ sleep 1000
+ if $x == 40 then
+ return -1
+ endi
+
+sql show d1.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto step5
+endi
+
+sql show d2.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto step5
+endi
+
+sql show d3.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto step5
+endi
+
+sql show d4.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto step5
+endi
+
system sh/exec.sh -n dnode3 -s stop -x SIGINT
-sleep 5000
-
sql reset query cache
-sleep 1000
+sleep 100
-sql_error insert into d1.t1 values(now, 3)
-sql_error insert into d2.t2 values(now, 3)
-sql_error insert into d3.t3 values(now, 3)
-sql_error insert into d4.t4 values(now, 3)
+sql_error insert into d1.t1 values(now, 3) -x s51
+s51:
+sql_error insert into d2.t2 values(now, 3) -x s52
+s52:
+sql_error insert into d3.t3 values(now, 3) -x s53
+s53:
+sql_error insert into d4.t4 values(now, 3) -x s54
+s54:
print ========= step6
system sh/exec.sh -n dnode3 -s start
-sleep 5000
+$x = 0
+step6:
+ $x = $x + 1
+ sleep 1000
+ if $x == 40 then
+ return -1
+ endi
+
+sql show d1.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto step6
+endi
+
+sql show d2.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto step6
+endi
+
+sql show d3.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto step6
+endi
+
+sql show d4.vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto step6
+endi
sql insert into d1.t1 values(now, 5)
sql insert into d2.t2 values(now, 5)
@@ -150,9 +291,4 @@ print d4.t4 $rows
system sh/exec.sh -n dnode1 -s stop -x SIGINT
system sh/exec.sh -n dnode2 -s stop -x SIGINT
-system sh/exec.sh -n dnode3 -s stop -x SIGINT
-system sh/exec.sh -n dnode4 -s stop -x SIGINT
-system sh/exec.sh -n dnode5 -s stop -x SIGINT
-system sh/exec.sh -n dnode6 -s stop -x SIGINT
-system sh/exec.sh -n dnode7 -s stop -x SIGINT
-system sh/exec.sh -n dnode8 -s stop -x SIGINT
\ No newline at end of file
+system sh/exec.sh -n dnode3 -s stop -x SIGINT
\ No newline at end of file
diff --git a/tests/script/unique/dnode/balance1.sim b/tests/script/unique/dnode/balance1.sim
index 10d185f353..8743204a03 100644
--- a/tests/script/unique/dnode/balance1.sim
+++ b/tests/script/unique/dnode/balance1.sim
@@ -33,7 +33,6 @@ system sh/cfg.sh -n dnode4 -c maxTablesPerVnode -v 4
print ========== step1
system sh/exec.sh -n dnode1 -s start
sql connect
-sleep 3000
sql create database d1
sql create table d1.t1 (t timestamp, i int)
@@ -50,15 +49,14 @@ if $data2_1 != 1 then
endi
print ========== step2
-sleep 2000
sql create dnode $hostname2
system sh/exec.sh -n dnode2 -s start
$x = 0
show2:
$x = $x + 1
- sleep 2000
- if $x == 10 then
+ sleep 1000
+ if $x == 20 then
return -1
endi
@@ -124,8 +122,8 @@ system sh/exec.sh -n dnode3 -s start
$x = 0
show5:
$x = $x + 1
- sleep 3000
- if $x == 20 then
+ sleep 1000
+ if $x == 30 then
return -1
endi
@@ -174,8 +172,8 @@ system sh/exec.sh -n dnode4 -s start
$x = 0
show7:
$x = $x + 1
- sleep 2000
- if $x == 10 then
+ sleep 1000
+ if $x == 20 then
return -1
endi
@@ -258,7 +256,7 @@ endi
system sh/exec.sh -n dnode3 -s stop -x SIGINT
sql reset query cache
-sleep 1000
+sleep 100
print ========== step10
sql select * from d1.t1 order by t desc
diff --git a/tests/script/unique/dnode/balance2.sim b/tests/script/unique/dnode/balance2.sim
index 23897df690..7b07eb3f37 100644
--- a/tests/script/unique/dnode/balance2.sim
+++ b/tests/script/unique/dnode/balance2.sim
@@ -32,7 +32,29 @@ sql create dnode $hostname2
sql create dnode $hostname3
system sh/exec.sh -n dnode2 -s start
system sh/exec.sh -n dnode3 -s start
-sleep 3000
+$x = 0
+step1:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
+sql show dnodes
+print dnode1 $data4_1
+print dnode2 $data4_2
+print dnode3 $data4_3
+print dnode4 $data4_4
+
+if $data4_1 != ready then
+ goto step1
+endi
+if $data4_2 != ready then
+ goto step1
+endi
+if $data4_3 != ready then
+ goto step1
+endi
sql create database d1 replica 2
sql create table d1.t1 (t timestamp, i int)
@@ -70,8 +92,8 @@ sql drop dnode $hostname2
$x = 0
show2:
$x = $x + 1
- sleep 2000
- if $x == 10 then
+ sleep 1000
+ if $x == 20 then
return -1
endi
@@ -90,7 +112,6 @@ if $data2_3 != 2 then
endi
system sh/exec.sh -n dnode2 -s stop -x SIGINT
-sleep 5000
print ========== step3
sql create dnode $hostname4
@@ -156,8 +177,8 @@ system sh/exec.sh -n dnode5 -s start
$x = 0
show5:
$x = $x + 1
- sleep 2000
- if $x == 10 then
+ sleep 1000
+ if $x == 20 then
return -1
endi
@@ -189,8 +210,8 @@ sql drop dnode $hostname3
$x = 0
show6:
$x = $x + 1
- sleep 2000
- if $x == 10 then
+ sleep 1000
+ if $x == 20 then
return -1
endi
@@ -217,10 +238,8 @@ if $data2_5 != 3 then
endi
system sh/exec.sh -n dnode2 -s stop -x SIGINT
-sleep 5000
-
sql reset query cache
-sleep 1000
+sleep 100
print ========== step7
sql select * from d1.t1 order by t desc
diff --git a/tests/script/unique/dnode/balance3.sim b/tests/script/unique/dnode/balance3.sim
index 9f7f3abb8b..f5558d504e 100644
--- a/tests/script/unique/dnode/balance3.sim
+++ b/tests/script/unique/dnode/balance3.sim
@@ -38,7 +38,32 @@ sql create dnode $hostname4
system sh/exec.sh -n dnode2 -s start
system sh/exec.sh -n dnode3 -s start
system sh/exec.sh -n dnode4 -s start
-sleep 3000
+$x = 0
+step1:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
+sql show dnodes
+print dnode1 $data4_1
+print dnode2 $data4_2
+print dnode3 $data4_3
+print dnode4 $data4_4
+
+if $data4_1 != ready then
+ goto step1
+endi
+if $data4_2 != ready then
+ goto step1
+endi
+if $data4_3 != ready then
+ goto step1
+endi
+if $data4_4 != ready then
+ goto step1
+endi
sql create database d1 replica 3
sql create table d1.t1 (t timestamp, i int)
@@ -81,7 +106,7 @@ sql drop dnode $hostname2
$x = 0
show2:
$x = $x + 1
- sleep 2000
+ sleep 1000
if $x == 20 then
return -1
endi
@@ -106,7 +131,6 @@ if $data2_4 != 2 then
endi
system sh/exec.sh -n dnode2 -s stop -x SIGINT
-sleep 5000
print ========== step
sql create dnode $hostname5
system sh/exec.sh -n dnode5 -s start
@@ -114,8 +138,8 @@ system sh/exec.sh -n dnode5 -s start
$x = 0
show3:
$x = $x + 1
- sleep 4000
- if $x == 15 then
+ sleep 1000
+ if $x == 60 then
return -1
endi
@@ -154,8 +178,8 @@ sql insert into d3.t3 values(now+5s, 31)
$x = 0
show4:
$x = $x + 1
- sleep 2000
- if $x == 20 then
+ sleep 1000
+ if $x == 30 then
return -1
endi
@@ -189,8 +213,8 @@ system sh/exec.sh -n dnode6 -s start
$x = 0
show5:
$x = $x + 1
- sleep 2000
- if $x == 10 then
+ sleep 1000
+ if $x == 20 then
return -1
endi
@@ -216,8 +240,8 @@ sql drop dnode $hostname3
$x = 0
show6:
$x = $x + 1
- sleep 2000
- if $x == 20 then
+ sleep 1000
+ if $x == 30 then
return -1
endi
@@ -245,10 +269,8 @@ if $data2_5 != 3 then
endi
system sh/exec.sh -n dnode3 -s stop -x SIGINT
-sleep 5000
-
sql reset query cache
-sleep 1000
+sleep 100
print ========== step7
sql select * from d1.t1 order by t desc
diff --git a/tests/script/unique/dnode/m2.sim b/tests/script/unique/dnode/m2.sim
new file mode 100644
index 0000000000..5fdf3b7400
--- /dev/null
+++ b/tests/script/unique/dnode/m2.sim
@@ -0,0 +1,367 @@
+system sh/stop_dnodes.sh
+
+system sh/deploy.sh -n dnode1 -i 1
+system sh/deploy.sh -n dnode2 -i 2
+system sh/deploy.sh -n dnode3 -i 3
+system sh/deploy.sh -n dnode4 -i 4
+system sh/deploy.sh -n dnode5 -i 5
+
+system sh/cfg.sh -n dnode1 -c balanceInterval -v 10
+system sh/cfg.sh -n dnode2 -c balanceInterval -v 10
+system sh/cfg.sh -n dnode3 -c balanceInterval -v 10
+system sh/cfg.sh -n dnode4 -c balanceInterval -v 10
+system sh/cfg.sh -n dnode5 -c balanceInterval -v 10
+
+system sh/cfg.sh -n dnode1 -c mnodeEqualVnodeNum -v 4
+system sh/cfg.sh -n dnode2 -c mnodeEqualVnodeNum -v 4
+system sh/cfg.sh -n dnode3 -c mnodeEqualVnodeNum -v 4
+system sh/cfg.sh -n dnode4 -c mnodeEqualVnodeNum -v 4
+system sh/cfg.sh -n dnode5 -c mnodeEqualVnodeNum -v 4
+
+system sh/cfg.sh -n dnode1 -c maxTablesPerVnode -v 4
+system sh/cfg.sh -n dnode2 -c maxTablesPerVnode -v 4
+system sh/cfg.sh -n dnode3 -c maxTablesPerVnode -v 4
+system sh/cfg.sh -n dnode4 -c maxTablesPerVnode -v 4
+system sh/cfg.sh -n dnode5 -c maxTablesPerVnode -v 4
+
+print ========== step1
+system sh/exec.sh -n dnode1 -s start
+sql connect
+
+sql create dnode $hostname2
+sql create dnode $hostname3
+system sh/exec.sh -n dnode2 -s start
+system sh/exec.sh -n dnode3 -s start
+$x = 0
+step1:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
+sql show dnodes
+print dnode1 $data4_1
+print dnode2 $data4_2
+print dnode3 $data4_3
+
+if $data4_1 != ready then
+ goto step1
+endi
+if $data4_2 != ready then
+ goto step1
+endi
+if $data4_3 != ready then
+ goto step1
+endi
+
+print ========== step2
+
+sql create database d1 replica 2
+sql create table d1.t1 (t timestamp, i int)
+sql insert into d1.t1 values(now+1s, 15)
+sql insert into d1.t1 values(now+2s, 14)
+sql insert into d1.t1 values(now+3s, 13)
+sql insert into d1.t1 values(now+4s, 12)
+sql insert into d1.t1 values(now+5s, 11)
+
+sql create database d2 replica 2
+sql create table d2.t2 (t timestamp, i int)
+sql insert into d2.t2 values(now+1s, 25)
+sql insert into d2.t2 values(now+2s, 24)
+sql insert into d2.t2 values(now+3s, 23)
+sql insert into d2.t2 values(now+4s, 22)
+sql insert into d2.t2 values(now+5s, 21)
+
+sql create database d3 replica 2
+sql create table d3.t3 (t timestamp, i int)
+sql insert into d3.t3 values(now+1s, 35)
+sql insert into d3.t3 values(now+2s, 34)
+sql insert into d3.t3 values(now+3s, 33)
+sql insert into d3.t3 values(now+4s, 32)
+sql insert into d3.t3 values(now+5s, 31)
+
+sql create database d4 replica 2
+sql create table d4.t4 (t timestamp, i int)
+sql insert into d4.t4 values(now+1s, 45)
+sql insert into d4.t4 values(now+2s, 44)
+sql insert into d4.t4 values(now+3s, 43)
+sql insert into d4.t4 values(now+4s, 42)
+sql insert into d4.t4 values(now+5s, 41)
+
+print ========== step2.1
+
+sql show dnodes
+print dnode1 openVnodes $data2_1
+print dnode2 openVnodes $data2_2
+print dnode3 openVnodes $data2_3
+
+if $data2_1 != 0 then
+ return -1
+endi
+if $data2_2 != 4 then
+ return -1
+endi
+if $data2_3 != 4 then
+ return -1
+endi
+
+sql show d1.vgroups;
+print d1.vgroups $data00 $data01 $data02 $data03 $data04 $data05 $data06 $data07 $data08 $data09
+
+sql show d2.vgroups;
+print d2.vgroups $data00 $data01 $data02 $data03 $data04 $data05 $data06 $data07 $data08 $data09
+
+sql show d3.vgroups;
+print d3.vgroups $data00 $data01 $data02 $data03 $data04 $data05 $data06 $data07 $data08 $data09
+
+sql show d4.vgroups;
+print d4.vgroups $data00 $data01 $data02 $data03 $data04 $data05 $data06 $data07 $data08 $data09
+
+print ========== step3
+sql create dnode $hostname4
+system sh/exec.sh -n dnode4 -s start
+sql create dnode $hostname5
+system sh/exec.sh -n dnode5 -s start
+
+
+$x = 0
+show3:
+ $x = $x + 1
+ sleep 1000
+ if $x == 40 then
+ return -1
+ endi
+
+sql show dnodes
+print dnode1 openVnodes $data2_1
+print dnode2 openVnodes $data2_2
+print dnode3 openVnodes $data2_3
+print dnode4 openVnodes $data2_4
+print dnode5 openVnodes $data2_5
+
+if $data2_2 != 2 then
+ goto show3
+endi
+if $data2_3 != 2 then
+ goto show3
+endi
+if $data2_4 != 2 then
+ goto show3
+endi
+if $data2_5 != 2 then
+ goto show3
+endi
+
+sql show d1.vgroups;
+print d1.vgroups $data00 $data01 $data02 $data03 $data04 $data05 $data06 $data07 $data08 $data09
+if $data03 != 2 then
+ goto show3
+endi
+
+sql show d2.vgroups;
+print d2.vgroups $data00 $data01 $data02 $data03 $data04 $data05 $data06 $data07 $data08 $data09
+if $data03 != 2 then
+ goto show3
+endi
+
+sql show d3.vgroups;
+print d3.vgroups $data00 $data01 $data02 $data03 $data04 $data05 $data06 $data07 $data08 $data09
+if $data03 != 2 then
+ goto show3
+endi
+
+sql show d4.vgroups;
+print d4.vgroups $data00 $data01 $data02 $data03 $data04 $data05 $data06 $data07 $data08 $data09
+if $data03 != 2 then
+ goto show3
+endi
+
+print ========== step4
+sql drop dnode $hostname2
+
+$x = 0
+show4:
+ $x = $x + 1
+ sleep 1000
+ if $x == 40 then
+ return -1
+ endi
+
+sql show dnodes
+print dnode1 openVnodes $data2_1
+print dnode2 openVnodes $data2_2
+print dnode3 openVnodes $data2_3
+print dnode4 openVnodes $data2_4
+print dnode5 openVnodes $data2_5
+
+if $data2_2 != null then
+ goto show4
+endi
+
+sql show d1.vgroups;
+print d1.vgroups $data00 $data01 $data02 $data03 $data04 $data05 $data06 $data07 $data08 $data09
+if $data03 != 2 then
+ goto show4
+endi
+
+sql show d2.vgroups;
+print d2.vgroups $data00 $data01 $data02 $data03 $data04 $data05 $data06 $data07 $data08 $data09
+if $data03 != 2 then
+ goto show4
+endi
+
+sql show d3.vgroups;
+print d3.vgroups $data00 $data01 $data02 $data03 $data04 $data05 $data06 $data07 $data08 $data09
+if $data03 != 2 then
+ goto show4
+endi
+
+sql show d4.vgroups;
+print d4.vgroups $data00 $data01 $data02 $data03 $data04 $data05 $data06 $data07 $data08 $data09
+if $data03 != 2 then
+ goto show4
+endi
+
+sql reset query cache
+sleep 100
+system sh/exec.sh -n dnode2 -s stop -x SIGINT
+
+print ========== step5
+sql drop dnode $hostname3
+
+$x = 0
+show5:
+ $x = $x + 1
+ sleep 1000
+ if $x == 40 then
+ return -1
+ endi
+
+
+sql show dnodes
+print dnode1 openVnodes $data2_1
+print dnode2 openVnodes $data2_2
+print dnode3 openVnodes $data2_3
+print dnode4 openVnodes $data2_4
+print dnode5 openVnodes $data2_5
+
+if $data2_2 != null then
+ goto show5
+endi
+if $data2_3 != null then
+ goto show5
+endi
+if $data2_4 != 4 then
+ goto show5
+endi
+if $data2_5 != 4 then
+ goto show4
+endi
+
+sql show d1.vgroups;
+print d1.vgroups $data00 $data01 $data02 $data03 $data04 $data05 $data06 $data07 $data08 $data09
+if $data03 != 2 then
+ goto show5
+endi
+
+sql show d2.vgroups;
+print d2.vgroups $data00 $data01 $data02 $data03 $data04 $data05 $data06 $data07 $data08 $data09
+if $data03 != 2 then
+ goto show5
+endi
+
+sql show d3.vgroups;
+print d3.vgroups $data00 $data01 $data02 $data03 $data04 $data05 $data06 $data07 $data08 $data09
+if $data03 != 2 then
+ goto show5
+endi
+
+sql show d4.vgroups;
+print d4.vgroups $data00 $data01 $data02 $data03 $data04 $data05 $data06 $data07 $data08 $data09
+if $data03 != 2 then
+ goto show5
+endi
+
+sql reset query cache
+sleep 100
+system sh/exec.sh -n dnode3 -s stop -x SIGINT
+
+print ========== step6
+sql select * from d1.t1 order by t desc
+print $data01 $data11 $data21 $data31 $data41
+if $data01 != 11 then
+ return -1
+endi
+if $data11 != 12 then
+ return -1
+endi
+if $data21 != 13 then
+ return -1
+endi
+if $data31 != 14 then
+ return -1
+endi
+if $data41 != 15 then
+ return -1
+endi
+
+sql select * from d2.t2 order by t desc
+print $data01 $data11 $data21 $data31 $data41
+if $data01 != 21 then
+ return -1
+endi
+if $data11 != 22 then
+ return -1
+endi
+if $data21 != 23 then
+ return -1
+endi
+if $data31 != 24 then
+ return -1
+endi
+if $data41 != 25 then
+ return -1
+endi
+
+sql select * from d3.t3 order by t desc
+print $data01 $data11 $data21 $data31 $data41
+if $data01 != 31 then
+ return -1
+endi
+if $data11 != 32 then
+ return -1
+endi
+if $data21 != 33 then
+ return -1
+endi
+if $data31 != 34 then
+ return -1
+endi
+if $data41 != 35 then
+ return -1
+endi
+
+sql select * from d4.t4 order by t desc
+print $data01 $data11 $data21 $data31 $data41
+if $data01 != 41 then
+ return -1
+endi
+if $data11 != 42 then
+ return -1
+endi
+if $data21 != 43 then
+ return -1
+endi
+if $data31 != 44 then
+ return -1
+endi
+if $data41 != 45 then
+ return -1
+endi
+
+system sh/exec.sh -n dnode1 -s stop -x SIGINT
+system sh/exec.sh -n dnode2 -s stop -x SIGINT
+system sh/exec.sh -n dnode3 -s stop -x SIGINT
+system sh/exec.sh -n dnode4 -s stop -x SIGINT
+system sh/exec.sh -n dnode5 -s stop -x SIGINT
\ No newline at end of file
diff --git a/tests/script/unique/dnode/m3.sim b/tests/script/unique/dnode/m3.sim
new file mode 100644
index 0000000000..5850147d04
--- /dev/null
+++ b/tests/script/unique/dnode/m3.sim
@@ -0,0 +1,359 @@
+system sh/stop_dnodes.sh
+
+system sh/deploy.sh -n dnode1 -i 1
+system sh/deploy.sh -n dnode2 -i 2
+system sh/deploy.sh -n dnode3 -i 3
+system sh/deploy.sh -n dnode4 -i 4
+system sh/deploy.sh -n dnode5 -i 5
+
+system sh/cfg.sh -n dnode1 -c balanceInterval -v 10
+system sh/cfg.sh -n dnode2 -c balanceInterval -v 10
+system sh/cfg.sh -n dnode3 -c balanceInterval -v 10
+system sh/cfg.sh -n dnode4 -c balanceInterval -v 10
+system sh/cfg.sh -n dnode5 -c balanceInterval -v 10
+
+system sh/cfg.sh -n dnode1 -c mnodeEqualVnodeNum -v 4
+system sh/cfg.sh -n dnode2 -c mnodeEqualVnodeNum -v 4
+system sh/cfg.sh -n dnode3 -c mnodeEqualVnodeNum -v 4
+system sh/cfg.sh -n dnode4 -c mnodeEqualVnodeNum -v 4
+system sh/cfg.sh -n dnode5 -c mnodeEqualVnodeNum -v 4
+
+system sh/cfg.sh -n dnode1 -c maxTablesPerVnode -v 4
+system sh/cfg.sh -n dnode2 -c maxTablesPerVnode -v 4
+system sh/cfg.sh -n dnode3 -c maxTablesPerVnode -v 4
+system sh/cfg.sh -n dnode4 -c maxTablesPerVnode -v 4
+system sh/cfg.sh -n dnode5 -c maxTablesPerVnode -v 4
+
+print ========== step1
+system sh/exec.sh -n dnode1 -s start
+sql connect
+
+sql create dnode $hostname2
+sql create dnode $hostname3
+sql create dnode $hostname4
+system sh/exec.sh -n dnode2 -s start
+system sh/exec.sh -n dnode3 -s start
+system sh/exec.sh -n dnode4 -s start
+$x = 0
+step1:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
+sql show dnodes
+print dnode1 $data4_1
+print dnode2 $data4_2
+print dnode3 $data4_3
+print dnode4 $data4_4
+
+if $data4_1 != ready then
+ goto step1
+endi
+if $data4_2 != ready then
+ goto step1
+endi
+if $data4_3 != ready then
+ goto step1
+endi
+if $data4_4 != ready then
+ goto step1
+endi
+
+print ========== step2
+
+sql create database d1 replica 3
+sql create table d1.t1 (t timestamp, i int)
+sql insert into d1.t1 values(now+1s, 15)
+sql insert into d1.t1 values(now+2s, 14)
+sql insert into d1.t1 values(now+3s, 13)
+sql insert into d1.t1 values(now+4s, 12)
+sql insert into d1.t1 values(now+5s, 11)
+
+sql create database d2 replica 3
+sql create table d2.t2 (t timestamp, i int)
+sql insert into d2.t2 values(now+1s, 25)
+sql insert into d2.t2 values(now+2s, 24)
+sql insert into d2.t2 values(now+3s, 23)
+sql insert into d2.t2 values(now+4s, 22)
+sql insert into d2.t2 values(now+5s, 21)
+
+sql create database d3 replica 3
+sql create table d3.t3 (t timestamp, i int)
+sql insert into d3.t3 values(now+1s, 35)
+sql insert into d3.t3 values(now+2s, 34)
+sql insert into d3.t3 values(now+3s, 33)
+sql insert into d3.t3 values(now+4s, 32)
+sql insert into d3.t3 values(now+5s, 31)
+
+sql create database d4 replica 3
+sql create table d4.t4 (t timestamp, i int)
+sql insert into d4.t4 values(now+1s, 45)
+sql insert into d4.t4 values(now+2s, 44)
+sql insert into d4.t4 values(now+3s, 43)
+sql insert into d4.t4 values(now+4s, 42)
+sql insert into d4.t4 values(now+5s, 41)
+
+print ========== step2.1
+
+sql show dnodes
+print dnode1 openVnodes $data2_1
+print dnode2 openVnodes $data2_2
+print dnode3 openVnodes $data2_3
+print dnode4 openVnodes $data2_4
+
+if $data2_1 != 0 then
+ return -1
+endi
+if $data2_2 != 4 then
+ return -1
+endi
+if $data2_3 != 4 then
+ return -1
+endi
+if $data2_4 != 4 then
+ return -1
+endi
+
+sql show d1.vgroups;
+print d1.vgroups $data00 $data01 $data02 $data03 $data04 $data05 $data06 $data07 $data08 $data09
+if $data04 != 4 then
+ return -1
+endi
+
+sql show d2.vgroups;
+print d2.vgroups $data00 $data01 $data02 $data03 $data04 $data05 $data06 $data07 $data08 $data09
+if $data04 != 3 then
+ return -1
+endi
+
+sql show d3.vgroups;
+print d3.vgroups $data00 $data01 $data02 $data03 $data04 $data05 $data06 $data07 $data08 $data09
+if $data04 != 2 then
+ return -1
+endi
+
+sql show d4.vgroups;
+print d4.vgroups $data00 $data01 $data02 $data03 $data04 $data05 $data06 $data07 $data08 $data09
+if $data04 != 4 then
+ return -1
+endi
+
+print ========== step3
+sql create dnode $hostname5
+system sh/exec.sh -n dnode5 -s start
+
+$x = 0
+show3:
+ $x = $x + 1
+ sleep 1000
+ if $x == 40 then
+ return -1
+ endi
+
+sql show dnodes
+print dnode1 openVnodes $data2_1
+print dnode2 openVnodes $data2_2
+print dnode3 openVnodes $data2_3
+print dnode4 openVnodes $data2_4
+print dnode5 openVnodes $data2_5
+
+if $data2_2 != 3 then
+ goto show3
+endi
+if $data2_3 != 3 then
+ goto show3
+endi
+if $data2_4 != 3 then
+ goto show3
+endi
+if $data2_5 != 3 then
+ goto show3
+endi
+
+sql show d1.vgroups;
+print d1.vgroups $data00 $data01 $data02 $data03 $data04 $data05 $data06 $data07 $data08 $data09
+if $data04 != 5 then
+ return -1
+endi
+if $data03 != 3 then
+ goto show3
+endi
+
+sql show d2.vgroups;
+print d2.vgroups $data00 $data01 $data02 $data03 $data04 $data05 $data06 $data07 $data08 $data09
+if $data04 != 5 then
+ return -1
+endi
+if $data03 != 3 then
+ goto show3
+endi
+
+sql show d3.vgroups;
+print d3.vgroups $data00 $data01 $data02 $data03 $data04 $data05 $data06 $data07 $data08 $data09
+if $data04 != 2 then
+ return -1
+endi
+if $data03 != 3 then
+ goto show3
+endi
+
+sql show d4.vgroups;
+print d4.vgroups $data00 $data01 $data02 $data03 $data04 $data05 $data06 $data07 $data08 $data09
+if $data04 != 4 then
+ return -1
+endi
+if $data03 != 3 then
+ goto show3
+endi
+
+print ========== step4
+sql drop dnode $hostname2
+
+$x = 0
+show4:
+ $x = $x + 1
+ sleep 1000
+ if $x == 40 then
+ return -1
+ endi
+
+
+sql show dnodes
+print dnode1 openVnodes $data2_1
+print dnode2 openVnodes $data2_2
+print dnode3 openVnodes $data2_3
+print dnode4 openVnodes $data2_4
+print dnode5 openVnodes $data2_5
+
+if $data2_2 != null then
+ goto show4
+endi
+if $data2_3 != 4 then
+ goto show4
+endi
+if $data2_4 != 4 then
+ goto show4
+endi
+if $data2_5 != 4 then
+ goto show4
+endi
+
+sql show d1.vgroups;
+print d1.vgroups $data00 $data01 $data02 $data03 $data04 $data05 $data06 $data07 $data08 $data09
+if $data04 != 5 then
+ return -1
+endi
+if $data03 != 3 then
+ goto show4
+endi
+
+sql show d2.vgroups;
+print d2.vgroups $data00 $data01 $data02 $data03 $data04 $data05 $data06 $data07 $data08 $data09
+if $data04 != 3 then
+ return -1
+endi
+if $data03 != 3 then
+ goto show4
+endi
+
+sql show d3.vgroups;
+print d3.vgroups $data00 $data01 $data02 $data03 $data04 $data05 $data06 $data07 $data08 $data09
+if $data04 != 4 then
+ return -1
+endi
+if $data03 != 3 then
+ goto show4
+endi
+
+sql show d4.vgroups;
+print d4.vgroups $data00 $data01 $data02 $data03 $data04 $data05 $data06 $data07 $data08 $data09
+if $data04 != 4 then
+ return -1
+endi
+if $data03 != 3 then
+ goto show4
+endi
+
+sql reset query cache
+sleep 100
+
+print ========== step5
+sql select * from d1.t1 order by t desc
+print $data01 $data11 $data21 $data31 $data41
+if $data01 != 11 then
+ return -1
+endi
+if $data11 != 12 then
+ return -1
+endi
+if $data21 != 13 then
+ return -1
+endi
+if $data31 != 14 then
+ return -1
+endi
+if $data41 != 15 then
+ return -1
+endi
+
+sql select * from d2.t2 order by t desc
+print $data01 $data11 $data21 $data31 $data41
+if $data01 != 21 then
+ return -1
+endi
+if $data11 != 22 then
+ return -1
+endi
+if $data21 != 23 then
+ return -1
+endi
+if $data31 != 24 then
+ return -1
+endi
+if $data41 != 25 then
+ return -1
+endi
+
+sql select * from d3.t3 order by t desc
+print $data01 $data11 $data21 $data31 $data41
+if $data01 != 31 then
+ return -1
+endi
+if $data11 != 32 then
+ return -1
+endi
+if $data21 != 33 then
+ return -1
+endi
+if $data31 != 34 then
+ return -1
+endi
+if $data41 != 35 then
+ return -1
+endi
+
+sql select * from d4.t4 order by t desc
+print $data01 $data11 $data21 $data31 $data41
+if $data01 != 41 then
+ return -1
+endi
+if $data11 != 42 then
+ return -1
+endi
+if $data21 != 43 then
+ return -1
+endi
+if $data31 != 44 then
+ return -1
+endi
+if $data41 != 45 then
+ return -1
+endi
+
+system sh/exec.sh -n dnode1 -s stop -x SIGINT
+system sh/exec.sh -n dnode2 -s stop -x SIGINT
+system sh/exec.sh -n dnode3 -s stop -x SIGINT
+system sh/exec.sh -n dnode4 -s stop -x SIGINT
+system sh/exec.sh -n dnode5 -s stop -x SIGINT
\ No newline at end of file
diff --git a/tests/script/unique/dnode/offline3.sim b/tests/script/unique/dnode/offline3.sim
new file mode 100644
index 0000000000..93c75e3b13
--- /dev/null
+++ b/tests/script/unique/dnode/offline3.sim
@@ -0,0 +1,111 @@
+system sh/stop_dnodes.sh
+
+system sh/deploy.sh -n dnode1 -i 1
+system sh/deploy.sh -n dnode2 -i 2
+system sh/deploy.sh -n dnode3 -i 3
+system sh/deploy.sh -n dnode4 -i 4
+
+system sh/cfg.sh -n dnode1 -c offlineThreshold -v 3
+system sh/cfg.sh -n dnode2 -c offlineThreshold -v 3
+system sh/cfg.sh -n dnode3 -c offlineThreshold -v 3
+system sh/cfg.sh -n dnode4 -c offlineThreshold -v 3
+
+system sh/cfg.sh -n dnode1 -c balanceInterval -v 300
+system sh/cfg.sh -n dnode2 -c balanceInterval -v 300
+system sh/cfg.sh -n dnode3 -c balanceInterval -v 300
+system sh/cfg.sh -n dnode4 -c balanceInterval -v 300
+
+system sh/cfg.sh -n dnode1 -c mnodeEqualVnodeNum -v 4
+system sh/cfg.sh -n dnode2 -c mnodeEqualVnodeNum -v 4
+system sh/cfg.sh -n dnode3 -c mnodeEqualVnodeNum -v 4
+system sh/cfg.sh -n dnode4 -c mnodeEqualVnodeNum -v 4
+
+print ========== step1
+system sh/exec.sh -n dnode1 -s start
+sql connect
+sql create dnode $hostname2
+system sh/exec.sh -n dnode2 -s start
+sql create dnode $hostname3
+system sh/exec.sh -n dnode3 -s start
+sql create dnode $hostname4
+system sh/exec.sh -n dnode4 -s start
+
+$x = 0
+step1:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
+sql show dnodes
+print dnode1 $data4_1
+print dnode2 $data4_2
+print dnode3 $data4_3
+print dnode4 $data4_4
+
+if $data4_1 != ready then
+ goto step1
+endi
+if $data4_2 != ready then
+ goto step1
+endi
+if $data4_3 != ready then
+ goto step1
+endi
+if $data4_4 != ready then
+ goto step1
+endi
+
+sql show mnodes
+print mnode1 $data2_1
+if $data2_1 != master then
+ goto step1
+endi
+
+print ========== step2
+sql create database db replica 3
+sql use db
+sql create table tb (ts timestamp, value int)
+sql insert into tb values (now, 1)
+sql insert into tb values (now, 2)
+
+sql show vgroups;
+print $data00 $data01 $data02 $data03 $data04 $data05 $data06 $data07 $data08 $data09
+
+print ========== step2
+system sh/exec.sh -n dnode4 -s stop -x SIGINT
+
+$x = 0
+step2:
+ $x = $x + 1
+ sleep 1000
+ if $x == 20 then
+ return -1
+ endi
+
+sql show vgroups;
+print $data00 $data01 $data02 $data03 $data04 $data05 $data06 $data07 $data08 $data09
+
+sql show dnodes
+print dnode1 $data4_1
+print dnode2 $data4_2
+print dnode3 $data4_3
+print dnode4 $data4_4
+
+if $data4_1 != ready then
+ goto step2
+endi
+if $data4_2 != ready then
+ goto step2
+endi
+if $data4_3 != ready then
+ goto step2
+endi
+if $data4_4 != null then
+ goto step2
+endi
+
+system sh/exec.sh -n dnode1 -s stop -x SIGINT
+system sh/exec.sh -n dnode2 -s stop -x SIGINT
+system sh/exec.sh -n dnode3 -s stop -x SIGINT
\ No newline at end of file
diff --git a/tests/script/unique/dnode/reason.sim b/tests/script/unique/dnode/reason.sim
index ad61a81b97..c685b1129d 100644
--- a/tests/script/unique/dnode/reason.sim
+++ b/tests/script/unique/dnode/reason.sim
@@ -5,7 +5,6 @@ system sh/deploy.sh -n dnode2 -i 2
print ========== step1
system sh/exec.sh -n dnode1 -s start
-sleep 3000
sql connect
sql create dnode $hostname2
@@ -18,38 +17,75 @@ endi
print ========== step2
system sh/exec.sh -n dnode2 -s start
-sleep 3000
+
+$x = 0
+step1:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
sql show dnodes
-print dnode1 off: $data7_1
-print dnode2 off: $data7_2
+print dnode1 $data4_1
+print dnode2 $data4_2
+
+if $data4_1 != ready then
+ goto step1
+endi
+if $data4_2 != ready then
+ goto step1
+endi
print ========== step3
system sh/exec.sh -n dnode2 -s stop
-sleep 3000
+
+$x = 0
+step3:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
sql show dnodes
print dnode1 off: $data7_1
print dnode2 off: $data7_2
if $data7_2 != @status msg timeout@ then
- return -1
+ goto step3
endi
print ========== step4
sql drop dnode $hostname2
-sleep 5000
+$x = 0
+step4:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
sql show dnodes
if $rows != 1 then
- return -1
+ goto step4
endi
print ========== step5
system sh/exec.sh -n dnode2 -s start
sql create dnode $hostname2
-sleep 3000
+
+$x = 0
+step5:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
sql show dnodes
print dnode1 off: $data7_1
print dnode2 off: $data7_3
if $data7_3 != @dnodeId not match@ then
- return -1
+ goto step5
endi
print ========== step6
@@ -58,12 +94,19 @@ system sh/cfg.sh -n dnode4 -c mnodeEqualVnodeNum -v 3
system sh/exec.sh -n dnode4 -s start
sql create dnode $hostname4
-sleep 3000
+$x = 0
+step6:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
sql show dnodes
print dnode1 off: $data7_1
print dnode4 off: $data7_4
if $data7_4 != @mnEqualVn not match@ then
- return -1
+ goto step6
endi
print ========== step7
@@ -72,12 +115,19 @@ system sh/cfg.sh -n dnode5 -c statusInterval -v 3
system sh/exec.sh -n dnode5 -s start
sql create dnode $hostname5
-sleep 3000
+$x = 0
+step7:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
sql show dnodes
print dnode1 off: $data7_1
print dnode5 off: $data7_5
if $data7_5 != @interval not match@ then
- return -1
+ goto step7
endi
print ========== step8
@@ -86,12 +136,19 @@ system sh/cfg.sh -n dnode6 -c balance -v 0
system sh/exec.sh -n dnode6 -s start
sql create dnode $hostname6
-sleep 3000
+$x = 0
+step8:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
sql show dnodes
print dnode1 off: $data7_1
print dnode6 off: $data7_6
if $data7_6 != @balance not match@ then
- return -1
+ goto step8
endi
print ========== step9
@@ -100,12 +157,19 @@ system sh/cfg.sh -n dnode7 -c maxTablesPerVnode -v 3000
system sh/exec.sh -n dnode7 -s start
sql create dnode $hostname7
-sleep 3000
+$x = 0
+step9:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
sql show dnodes
print dnode1 off: $data7_1
print dnode7 off: $data7_7
if $data7_7 != @maxTabPerVn not match@ then
- return -1
+ goto step9
endi
print ========== step10
@@ -114,12 +178,19 @@ system sh/cfg.sh -n dnode8 -c maxVgroupsPerDb -v 3
system sh/exec.sh -n dnode8 -s start
sql create dnode $hostname8
-sleep 3000
+$x = 0
+step10:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
sql show dnodes
print dnode1 off: $data7_1
print dnode8 off: $data7_8
if $data7_8 != @maxVgPerDb not match@ then
- return -1
+ goto step10
endi
system sh/exec.sh -n dnode1 -s stop -x SIGINT
diff --git a/tests/script/unique/dnode/remove1.sim b/tests/script/unique/dnode/remove1.sim
index 6bde68b8b5..6f830d2cf8 100644
--- a/tests/script/unique/dnode/remove1.sim
+++ b/tests/script/unique/dnode/remove1.sim
@@ -22,7 +22,6 @@ system sh/cfg.sh -n dnode4 -c maxTablesPerVnode -v 4
print ========== step1
system sh/exec.sh -n dnode1 -s start
-sleep 3000
sql connect
sql create database d1
@@ -50,7 +49,26 @@ endi
print ========== step2
sql create dnode $hostname2
system sh/exec.sh -n dnode2 -s start
-sleep 9000
+$x = 0
+step2:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
+sql show dnodes
+print dnode1 $data4_1
+print dnode2 $data4_2
+print dnode3 $data4_3
+print dnode4 $data4_4
+
+if $data4_1 != ready then
+ goto step2
+endi
+if $data4_2 != ready then
+ goto step2
+endi
sql create database d3 replica 2
sql create table d3.t3 (t timestamp, i int)
@@ -81,12 +99,11 @@ endi
print ========== step3
sql drop dnode $hostname2
-sleep 7001
$x = 0
show3:
$x = $x + 1
- sleep 2000
- if $x == 10 then
+ sleep 1000
+ if $x == 20 then
return -1
endi
@@ -101,8 +118,8 @@ system sh/exec.sh -n dnode3 -s start
$x = 0
show4:
$x = $x + 1
- sleep 2000
- if $x == 10 then
+ sleep 1000
+ if $x == 20 then
return -1
endi
@@ -115,7 +132,6 @@ if $data2_2 != null then
endi
system sh/exec.sh -n dnode2 -s stop -x SIGINT
-sleep 5000
print ========== step5
sql create dnode $hostname4
@@ -124,8 +140,8 @@ system sh/exec.sh -n dnode4 -s start
$x = 0
show5:
$x = $x + 1
- sleep 2000
- if $x == 10 then
+ sleep 1000
+ if $x == 20 then
return -1
endi
sql show dnodes
diff --git a/tests/script/unique/dnode/remove2.sim b/tests/script/unique/dnode/remove2.sim
index 903e262be7..f97e55164b 100644
--- a/tests/script/unique/dnode/remove2.sim
+++ b/tests/script/unique/dnode/remove2.sim
@@ -22,7 +22,6 @@ system sh/cfg.sh -n dnode4 -c maxTablesPerVnode -v 4
print ========== step1
system sh/exec.sh -n dnode1 -s start
-sleep 3000
sql connect
sql create database d1
@@ -50,7 +49,26 @@ endi
print ========== step2
sql create dnode $hostname2
system sh/exec.sh -n dnode2 -s start
-sleep 9000
+$x = 0
+step2:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
+sql show dnodes
+print dnode1 $data4_1
+print dnode2 $data4_2
+print dnode3 $data4_3
+print dnode4 $data4_4
+
+if $data4_1 != ready then
+ goto step2
+endi
+if $data4_2 != ready then
+ goto step2
+endi
sql create database d3 replica 2
sql create table d3.t3 (t timestamp, i int)
@@ -81,7 +99,6 @@ endi
print ========== step3
system sh/exec.sh -n dnode2 -s stop -x SIGINT
sql drop dnode $hostname2
-sleep 5000
sql show dnodes
print dnode1 openVnodes $data2_1
@@ -91,14 +108,20 @@ print ========== step4
sql create dnode $hostname3
system sh/exec.sh -n dnode3 -s start
-sleep 5000
+$x = 0
+step4:
+ $x = $x + 1
+ sleep 1000
+ if $x == 20 then
+ return -1
+ endi
sql show dnodes
print dnode1 openVnodes $data2_1
print dnode2 openVnodes $data2_2
print dnode3 openVnodes $data2_3
if $data2_3 != 0 then
- return -1
+ goto step4
endi
print ============ step 4.1
@@ -107,8 +130,8 @@ system sh/exec.sh -n dnode2 -s start
$x = 0
show4:
$x = $x + 1
- sleep 2000
- if $x == 10 then
+ sleep 1000
+ if $x == 20 then
return -1
endi
diff --git a/tests/script/unique/dnode/vnode_clean.sim b/tests/script/unique/dnode/vnode_clean.sim
index f90f3d3fd0..76311a6cac 100644
--- a/tests/script/unique/dnode/vnode_clean.sim
+++ b/tests/script/unique/dnode/vnode_clean.sim
@@ -45,8 +45,8 @@ system sh/exec.sh -n dnode2 -s start
$x = 0
show2:
$x = $x + 1
- sleep 2000
- if $x == 10 then
+ sleep 1000
+ if $x == 20 then
return -1
endi
sql show dnodes
@@ -86,8 +86,8 @@ sql drop dnode $hostname2
$x = 0
show4:
$x = $x + 1
- sleep 2000
- if $x == 10 then
+ sleep 1000
+ if $x == 20 then
return -1
endi
sql show dnodes
@@ -106,15 +106,14 @@ endi
system sh/exec.sh -n dnode2 -s stop -x SIGINT
print ========== step5
-sleep 5000
sql create dnode $hostname3
system sh/exec.sh -n dnode3 -s start
$x = 0
show5:
$x = $x + 1
- sleep 3000
- if $x == 20 then
+ sleep 1000
+ if $x == 40 then
return -1
endi
sql show dnodes
@@ -153,8 +152,8 @@ system sh/exec.sh -n dnode4 -s start
$x = 0
show7:
$x = $x + 1
- sleep 3000
- if $x == 20 then
+ sleep 1000
+ if $x == 40 then
return -1
endi
@@ -184,8 +183,8 @@ sql insert into d4.t4 values(now+5s, 41)
$x = 0
show8:
$x = $x + 1
- sleep 2000
- if $x == 10 then
+ sleep 1000
+ if $x == 20 then
return -1
endi
sql show dnodes
@@ -208,8 +207,8 @@ sql drop dnode $hostname3
$x = 0
show9:
$x = $x + 1
- sleep 2000
- if $x == 10 then
+ sleep 1000
+ if $x == 20 then
return -1
endi
@@ -228,7 +227,6 @@ if $data2_4 != 4 then
endi
system sh/exec.sh -n dnode3 -s stop
-sleep 5000
print ========== step10
sql select * from d1.t1 order by t desc
diff --git a/tests/script/unique/import/replica2.sim b/tests/script/unique/import/replica2.sim
index f2836fe470..54ce28543e 100644
--- a/tests/script/unique/import/replica2.sim
+++ b/tests/script/unique/import/replica2.sim
@@ -27,11 +27,30 @@ system sh/cfg.sh -n dnode4 -c walLevel -v 2
print ========= start dnode1
system sh/exec.sh -n dnode1 -s start
-sleep 3000
sql connect
sql create dnode $hostname2
system sh/exec.sh -n dnode2 -s start
+$x = 0
+step1:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
+sql show dnodes
+print dnode1 $data4_1
+print dnode2 $data4_2
+print dnode3 $data4_3
+print dnode4 $data4_4
+
+if $data4_1 != ready then
+ goto step1
+endi
+if $data4_2 != ready then
+ goto step1
+endi
sql create database ir2db replica 2 days 7
sql use ir2db
@@ -96,9 +115,22 @@ endi
print ================== dnode restart
system sh/exec.sh -n dnode1 -s stop -x SIGINT
-sleep 5000
system sh/exec.sh -n dnode1 -s start
-sleep 5000
+
+$x = 0
+a1:
+ $x = $x + 1
+ sleep 1000
+ if $x == 40 then
+ return -1
+ endi
+
+sql show vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto a1
+endi
+
sql select * from tb;
if $rows != 14 then
return -1
@@ -163,9 +195,22 @@ endi
print ================= step10
system sh/exec.sh -n dnode1 -s stop -x SIGINT
-sleep 5000
system sh/exec.sh -n dnode1 -s start
-sleep 5000
+
+$x = 0
+a2:
+ $x = $x + 1
+ sleep 1000
+ if $x == 40 then
+ return -1
+ endi
+
+sql show vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto a2
+endi
+
sql select * from tb;
print $rows
if $rows != 35 then
@@ -193,9 +238,20 @@ endi
print ================= step13
system sh/exec.sh -n dnode2 -s stop -x SIGINT
-sleep 5000
system sh/exec.sh -n dnode2 -s start
-sleep 5000
+$x = 0
+a3:
+ $x = $x + 1
+ sleep 1000
+ if $x == 40 then
+ return -1
+ endi
+
+sql show vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto a3
+endi
print ================= step14
#1520000000000
@@ -214,12 +270,24 @@ endi
print ================= step15
system sh/exec.sh -n dnode1 -s stop -x SIGINT
-sleep 5000
system sh/exec.sh -n dnode1 -s start
-sleep 5000
+$x = 0
+a4:
+ $x = $x + 1
+ sleep 1000
+ if $x == 40 then
+ return -1
+ endi
+sql show vgroups
+print online vnodes $data03
+if $data03 != 2 then
+ goto a4
+endi
+
+sql select * from tb;
if $rows != 52 then
- return -1
+ goto a4
endi
system sh/exec.sh -n dnode1 -s stop -x SIGINT
diff --git a/tests/script/unique/import/replica3.sim b/tests/script/unique/import/replica3.sim
index 3a9f03a7ea..714141c412 100644
--- a/tests/script/unique/import/replica3.sim
+++ b/tests/script/unique/import/replica3.sim
@@ -27,7 +27,6 @@ system sh/cfg.sh -n dnode4 -c walLevel -v 2
print ========= start dnode1
system sh/exec.sh -n dnode1 -s start
-sleep 3000
sql connect
sql create dnode $hostname2
@@ -35,6 +34,29 @@ sql create dnode $hostname3
system sh/exec.sh -n dnode2 -s start
system sh/exec.sh -n dnode3 -s start
+$x = 0
+step1:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
+sql show dnodes
+print dnode1 $data4_1
+print dnode2 $data4_2
+print dnode3 $data4_3
+print dnode4 $data4_4
+
+if $data4_1 != ready then
+ goto step1
+endi
+if $data4_2 != ready then
+ goto step1
+endi
+if $data4_3 != ready then
+ goto step1
+endi
sql create database ir3db replica 3 days 7
sql use ir3db
@@ -99,9 +121,20 @@ endi
print ================== dnode restart
system sh/exec.sh -n dnode1 -s stop -x SIGINT
-sleep 5000
system sh/exec.sh -n dnode1 -s start
-sleep 5000
+$x = 0
+a4:
+ $x = $x + 1
+ sleep 1000
+ if $x == 40 then
+ return -1
+ endi
+sql show vgroups
+print online vnodes $data03
+if $data03 != 3 then
+ goto a4
+endi
+
sql select * from tb;
if $rows != 14 then
return -1
@@ -166,9 +199,21 @@ endi
print ================= step10
system sh/exec.sh -n dnode1 -s stop -x SIGINT
-sleep 5000
system sh/exec.sh -n dnode1 -s start
-sleep 5000
+
+$x = 0
+step10:
+ $x = $x + 1
+ sleep 1000
+ if $x == 40 then
+ return -1
+ endi
+sql show vgroups
+print online vnodes $data03
+if $data03 != 3 then
+ goto step10
+endi
+
sql select * from tb;
print $rows
if $rows != 35 then
@@ -217,10 +262,21 @@ endi
print ================= step15
system sh/exec.sh -n dnode3 -s stop -x SIGINT
-sleep 5000
system sh/exec.sh -n dnode3 -s start
-sleep 5000
+$x = 0
+step15:
+ $x = $x + 1
+ sleep 1000
+ if $x == 40 then
+ return -1
+ endi
+sql show vgroups
+print online vnodes $data03
+if $data03 != 3 then
+ goto step15
+endi
+sql select * from tb;
if $rows != 52 then
return -1
endi
diff --git a/tests/script/unique/migrate/mn2_vn2_repl2_rmMnodeDir.sim b/tests/script/unique/migrate/mn2_vn2_repl2_rmMnodeDir.sim
index 12f0013191..9b02933cbf 100644
--- a/tests/script/unique/migrate/mn2_vn2_repl2_rmMnodeDir.sim
+++ b/tests/script/unique/migrate/mn2_vn2_repl2_rmMnodeDir.sim
@@ -194,36 +194,35 @@ print $data0_1 $data1_1 $data2_1 $data3_1 $data4_1 $data5_1 $data6_1 $dat
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
print $data0_4 $data1_4 $data2_4 $data3_4 $data4_4 $data5_4 $data6_4 $data7_4 $data8_4 $data9_4
-$d2v2status = $data5_4
-$d2v3status = $data5_2
-$d2v4status = $data5_3
-$d1v2status = $data7_4
-$d1v3status = $data7_2
-$d1v4status = $data7_3
-
-if $d2v2status != master then
+if $data5_4 != master then
+ print $data5_4
sleep 2000
goto wait_dnode1_vgroup_slave
endi
-if $d2v3status != master then
+if $data5_3 != slave then
+print $data5_2
sleep 2000
goto wait_dnode1_vgroup_slave
endi
-if $d2v4status != master then
+if $data5_2 != master then
+print $data5_3
sleep 2000
goto wait_dnode1_vgroup_slave
endi
-if $d1v2status != slave then
+if $data7_4 != slave then
+ print $data7_4
sleep 2000
goto wait_dnode1_vgroup_slave
endi
-if $d1v3status != slave then
+if $data7_3 != master then
+ print $data7_3
sleep 2000
goto wait_dnode1_vgroup_slave
endi
-if $d1v4status != slave then
+if $data7_2 != slave then
+ print $data7_2
sleep 2000
goto wait_dnode1_vgroup_slave
endi
@@ -264,4 +263,13 @@ sql select count(*) from $stb
print data00 $data00
if $data00 != $totalRows then
return -1
-endi
\ No newline at end of file
+endi
+
+system sh/exec.sh -n dnode1 -s stop -x SIGINT
+system sh/exec.sh -n dnode2 -s stop -x SIGINT
+system sh/exec.sh -n dnode3 -s stop -x SIGINT
+system sh/exec.sh -n dnode4 -s stop -x SIGINT
+system sh/exec.sh -n dnode5 -s stop -x SIGINT
+system sh/exec.sh -n dnode6 -s stop -x SIGINT
+system sh/exec.sh -n dnode7 -s stop -x SIGINT
+system sh/exec.sh -n dnode8 -s stop -x SIGINT
\ No newline at end of file
diff --git a/tests/script/unique/migrate/mn2_vn2_repl2_rmMnodeVnodeDir.sim b/tests/script/unique/migrate/mn2_vn2_repl2_rmMnodeVnodeDir.sim
index 29da1fd773..90183949e7 100644
--- a/tests/script/unique/migrate/mn2_vn2_repl2_rmMnodeVnodeDir.sim
+++ b/tests/script/unique/migrate/mn2_vn2_repl2_rmMnodeVnodeDir.sim
@@ -196,36 +196,29 @@ print $data0_1 $data1_1 $data2_1 $data3_1 $data4_1 $data5_1 $data6_1 $dat
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
print $data0_4 $data1_4 $data2_4 $data3_4 $data4_4 $data5_4 $data6_4 $data7_4 $data8_4 $data9_4
-$d2v2status = $data5_4
-$d2v3status = $data5_2
-$d2v4status = $data5_3
-$d1v2status = $data7_4
-$d1v3status = $data7_2
-$d1v4status = $data7_3
-
-if $d2v2status != master then
+if $data5_4 != master then
sleep 2000
goto wait_dnode1_vgroup_slave
endi
-if $d2v3status != master then
+if $data5_3 != slave then
sleep 2000
goto wait_dnode1_vgroup_slave
endi
-if $d2v4status != master then
+if $data5_2 != master then
sleep 2000
goto wait_dnode1_vgroup_slave
endi
-if $d1v2status != slave then
+if $data7_4 != slave then
sleep 2000
goto wait_dnode1_vgroup_slave
endi
-if $d1v3status != slave then
+if $data7_3 != master then
sleep 2000
goto wait_dnode1_vgroup_slave
endi
-if $d1v4status != slave then
+if $data7_2 != slave then
sleep 2000
goto wait_dnode1_vgroup_slave
endi
@@ -266,4 +259,13 @@ sql select count(*) from $stb
print data00 $data00
if $data00 != $totalRows then
return -1
-endi
\ No newline at end of file
+endi
+
+system sh/exec.sh -n dnode1 -s stop -x SIGINT
+system sh/exec.sh -n dnode2 -s stop -x SIGINT
+system sh/exec.sh -n dnode3 -s stop -x SIGINT
+system sh/exec.sh -n dnode4 -s stop -x SIGINT
+system sh/exec.sh -n dnode5 -s stop -x SIGINT
+system sh/exec.sh -n dnode6 -s stop -x SIGINT
+system sh/exec.sh -n dnode7 -s stop -x SIGINT
+system sh/exec.sh -n dnode8 -s stop -x SIGINT
\ No newline at end of file
diff --git a/tests/script/unique/migrate/mn2_vn2_repl2_rmVnodeDir.sim b/tests/script/unique/migrate/mn2_vn2_repl2_rmVnodeDir.sim
index 8a1132de2e..02e2cd02e1 100644
--- a/tests/script/unique/migrate/mn2_vn2_repl2_rmVnodeDir.sim
+++ b/tests/script/unique/migrate/mn2_vn2_repl2_rmVnodeDir.sim
@@ -194,36 +194,29 @@ print $data0_1 $data1_1 $data2_1 $data3_1 $data4_1 $data5_1 $data6_1 $dat
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
print $data0_4 $data1_4 $data2_4 $data3_4 $data4_4 $data5_4 $data6_4 $data7_4 $data8_4 $data9_4
-$d2v2status = $data5_4
-$d2v3status = $data5_2
-$d2v4status = $data5_3
-$d1v2status = $data7_4
-$d1v3status = $data7_2
-$d1v4status = $data7_3
-
-if $d2v2status != master then
+if $data5_4 != master then
sleep 2000
goto wait_dnode1_vgroup_slave
endi
-if $d2v3status != master then
+if $data5_3 != slave then
sleep 2000
goto wait_dnode1_vgroup_slave
endi
-if $d2v4status != master then
+if $data5_2 != master then
sleep 2000
goto wait_dnode1_vgroup_slave
endi
-if $d1v2status != slave then
+if $data7_4 != slave then
sleep 2000
goto wait_dnode1_vgroup_slave
endi
-if $d1v3status != slave then
+if $data7_3 != master then
sleep 2000
goto wait_dnode1_vgroup_slave
endi
-if $d1v4status != slave then
+if $data7_2 != slave then
sleep 2000
goto wait_dnode1_vgroup_slave
endi
@@ -264,4 +257,13 @@ sql select count(*) from $stb
print data00 $data00
if $data00 != $totalRows then
return -1
-endi
\ No newline at end of file
+endi
+
+system sh/exec.sh -n dnode1 -s stop -x SIGINT
+system sh/exec.sh -n dnode2 -s stop -x SIGINT
+system sh/exec.sh -n dnode3 -s stop -x SIGINT
+system sh/exec.sh -n dnode4 -s stop -x SIGINT
+system sh/exec.sh -n dnode5 -s stop -x SIGINT
+system sh/exec.sh -n dnode6 -s stop -x SIGINT
+system sh/exec.sh -n dnode7 -s stop -x SIGINT
+system sh/exec.sh -n dnode8 -s stop -x SIGINT
\ No newline at end of file
diff --git a/tests/script/unique/mnode/mgmt20.sim b/tests/script/unique/mnode/mgmt20.sim
index e51d429925..6eb35b67ac 100644
--- a/tests/script/unique/mnode/mgmt20.sim
+++ b/tests/script/unique/mnode/mgmt20.sim
@@ -11,7 +11,6 @@ system sh/cfg.sh -n dnode2 -c monitor -v 1
print ============== step1
system sh/exec.sh -n dnode1 -s start
system sh/exec.sh -n dnode2 -s start
-sleep 3000
sql connect
print ============== step2
@@ -20,8 +19,8 @@ sql create dnode $hostname2
$x = 0
show2:
$x = $x + 1
- sleep 2000
- if $x == 10 then
+ sleep 1000
+ if $x == 20 then
return -1
endi
diff --git a/tests/script/unique/mnode/mgmt22.sim b/tests/script/unique/mnode/mgmt22.sim
index d55e36d7fc..1dc419b17d 100644
--- a/tests/script/unique/mnode/mgmt22.sim
+++ b/tests/script/unique/mnode/mgmt22.sim
@@ -9,7 +9,6 @@ system sh/cfg.sh -n dnode3 -c numOfMnodes -v 2
print ============== step1
system sh/exec.sh -n dnode1 -s start
-sleep 3000
sql connect
sql show mnodes
@@ -26,8 +25,8 @@ sql create dnode $hostname2
$x = 0
show2:
$x = $x + 1
- sleep 2000
- if $x == 10 then
+ sleep 1000
+ if $x == 20 then
return -1
endi
@@ -64,8 +63,8 @@ sql connect
$x = 0
show6:
$x = $x + 1
- sleep 2000
- if $x == 10 then
+ sleep 1000
+ if $x == 20 then
return -1
endi
@@ -82,13 +81,12 @@ endi
print ============== step7
system sh/exec.sh -n dnode3 -s start
sql create dnode $hostname3
-sleep 5000
$x = 0
show7:
$x = $x + 1
- sleep 2000
- if $x == 10 then
+ sleep 1000
+ if $x == 20 then
return -1
endi
diff --git a/tests/script/unique/mnode/mgmt23.sim b/tests/script/unique/mnode/mgmt23.sim
index d1820ef8c6..19c7b4ba76 100644
--- a/tests/script/unique/mnode/mgmt23.sim
+++ b/tests/script/unique/mnode/mgmt23.sim
@@ -25,8 +25,8 @@ sql create dnode $hostname2
$x = 0
show2:
$x = $x + 1
- sleep 2000
- if $x == 10 then
+ sleep 1000
+ if $x == 20 then
return -1
endi
@@ -65,7 +65,14 @@ endi
print ============== step4
sql drop dnode $hostname2
-sleep 10000
+
+$x = 0
+step4:
+ $x = $x + 1
+ sleep 1000
+ if $x == 20 then
+ return -1
+ endi
sql show mnodes
$dnode1Role = $data2_1
@@ -76,13 +83,13 @@ print dnode2 ==> $dnode2Role
print dnode3 ==> $dnode3Role
if $dnode1Role != master then
- return -1
+ goto step4
endi
if $dnode2Role != null then
- return -1
+ goto step4
endi
if $dnode3Role != slave then
- return -1
+ goto step4
endi
system sh/exec.sh -n dnode2 -s stop
@@ -93,7 +100,14 @@ sql create dnode $hostname2
system sh/deploy.sh -n dnode2 -i 2
system sh/cfg.sh -n dnode2 -c numOfMnodes -v 2
system sh/exec.sh -n dnode2 -s start
-sleep 8000
+
+$x = 0
+step5:
+ $x = $x + 1
+ sleep 1000
+ if $x == 20 then
+ return -1
+ endi
sql show mnodes
$dnode1Role = $data2_1
@@ -104,19 +118,17 @@ print dnode2 ==> $dnode2Role
print dnode3 ==> $dnode3Role
if $dnode1Role != master then
- return -1
+ goto step5
endi
if $dnode2Role != null then
- return -1
+ goto step5
endi
if $dnode3Role != slave then
- return -1
+ goto step5
endi
print ============== step6
system sh/exec.sh -n dnode1 -s stop
-sleep 10000
-
sql_error show mnodes
print ============== step7
@@ -126,7 +138,4 @@ system sh/exec.sh -n dnode1 -s stop -x SIGINT
system sh/exec.sh -n dnode2 -s stop -x SIGINT
system sh/exec.sh -n dnode3 -s stop -x SIGINT
system sh/exec.sh -n dnode4 -s stop -x SIGINT
-system sh/exec.sh -n dnode5 -s stop -x SIGINT
-system sh/exec.sh -n dnode6 -s stop -x SIGINT
-system sh/exec.sh -n dnode7 -s stop -x SIGINT
-system sh/exec.sh -n dnode8 -s stop -x SIGINT
\ No newline at end of file
+system sh/exec.sh -n dnode5 -s stop -x SIGINT
\ No newline at end of file
diff --git a/tests/script/unique/mnode/mgmt33.sim b/tests/script/unique/mnode/mgmt33.sim
index 205e1b05d3..ce7cdce35d 100644
--- a/tests/script/unique/mnode/mgmt33.sim
+++ b/tests/script/unique/mnode/mgmt33.sim
@@ -28,7 +28,14 @@ endi
print ============== step2
system sh/exec.sh -n dnode2 -s start
sql create dnode $hostname2
-sleep 8000
+
+$x = 0
+step2:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
sql show mnodes
$dnode1Role = $data2_1
@@ -39,19 +46,26 @@ print dnode2 ==> $dnode2Role
print dnode3 ==> $dnode3Role
if $dnode1Role != master then
- return -1
+ goto step2
endi
if $dnode2Role != slave then
- return -1
+ goto step2
endi
if $dnode3Role != null then
- return -1
+ goto step2
endi
print ============== step3
system sh/exec.sh -n dnode3 -s start
sql create dnode $hostname3
-sleep 8000
+
+$x = 0
+step3:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
sql show mnodes
$dnode1Role = $data2_1
@@ -62,18 +76,25 @@ print dnode2 ==> $dnode2Role
print dnode3 ==> $dnode3Role
if $dnode1Role != master then
- return -1
+ goto step3
endi
if $dnode2Role != slave then
- return -1
+ goto step3
endi
if $dnode3Role != slave then
- return -1
+ goto step3
endi
print ============== step4
sql drop dnode $hostname2
-sleep 8000
+
+$x = 0
+step4:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
sql show mnodes
$dnode1Role = $data2_1
@@ -84,25 +105,30 @@ print dnode2 ==> $dnode2Role
print dnode3 ==> $dnode3Role
if $dnode1Role != master then
- return -1
+ goto step4
endi
if $dnode2Role != null then
- return -1
+ goto step4
endi
if $dnode3Role != slave then
- return -1
+ goto step4
endi
system sh/exec.sh -n dnode2 -s stop
-sleep 3000
-
system sh/deploy.sh -n dnode2 -i 2
system sh/cfg.sh -n dnode2 -c numOfMnodes -v 3
system sh/exec.sh -n dnode2 -s start
print ============== step5
sql create dnode $hostname2
-sleep 8000
+
+$x = 0
+step5:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
sql show mnodes
$dnode1Role = $data2_1
@@ -113,20 +139,26 @@ print dnode2 ==> $dnode2Role
print dnode3 ==> $dnode3Role
if $dnode1Role != master then
- return -1
+ goto step5
endi
if $dnode2Role != slave then
- return -1
+ goto step5
endi
if $dnode3Role != slave then
- return -1
+ goto step5
endi
print ============== step6
system sh/exec.sh -n dnode1 -s stop
-sleep 10000
+$x = 0
+step6:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
-sql show mnodes
+sql show mnodes -x step6
$dnode1Role = $data2_1
$dnode2Role = $data2_4
$dnode3Role = $data2_3
@@ -135,7 +167,7 @@ print dnode2 ==> $dnode2Role
print dnode3 ==> $dnode3Role
if $dnode1Role != offline then
- return -1
+ goto step6
endi
#if $dnode2Role != master then
# return -1
@@ -146,9 +178,15 @@ endi
print ============== step7
sql drop dnode $hostname1
-sleep 8000
+$x = 0
+step7:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
-sql show mnodes
+sql show mnodes -x step7
$dnode1Role = $data2_1
$dnode2Role = $data2_2
$dnode3Role = $data2_3
@@ -157,7 +195,7 @@ print dnode2 ==> $dnode2Role
print dnode3 ==> $dnode3Role
if $dnode1Role != null then
- return -1
+ goto step7
endi
#if $dnode2Role != master then
# return -1
diff --git a/tests/script/unique/mnode/mgmt34.sim b/tests/script/unique/mnode/mgmt34.sim
index 96e3133d76..d8a46b0955 100644
--- a/tests/script/unique/mnode/mgmt34.sim
+++ b/tests/script/unique/mnode/mgmt34.sim
@@ -12,7 +12,6 @@ system sh/cfg.sh -n dnode4 -c numOfMnodes -v 3
print ============== step1
system sh/exec.sh -n dnode1 -s start
-sleep 3000
sql connect
sql show mnodes
@@ -32,7 +31,13 @@ endi
print ============== step2
system sh/exec.sh -n dnode2 -s start
sql create dnode $hostname2
-sleep 8000
+$x = 0
+step2:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
sql show mnodes
$dnode1Role = $data2_1
@@ -45,22 +50,29 @@ print dnode3 ==> $dnode3Role
print dnode4 ==> $dnode4Role
if $dnode1Role != master then
- return -1
+ goto step2
endi
if $dnode2Role != slave then
- return -1
+ goto step2
endi
if $dnode3Role != null then
- return -1
+ goto step2
endi
if $dnode4Role != null then
- return -1
+ goto step2
endi
print ============== step3
system sh/exec.sh -n dnode3 -s start
sql create dnode $hostname3
-sleep 8000
+
+$x = 0
+step3:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
sql show mnodes
$dnode1Role = $data2_1
@@ -73,23 +85,29 @@ print dnode3 ==> $dnode3Role
print dnode4 ==> $dnode4Role
if $dnode1Role != master then
- return -1
+ goto step3
endi
if $dnode2Role != slave then
- return -1
+ goto step3
endi
if $dnode3Role != slave then
- return -1
+ goto step3
endi
if $dnode4Role != null then
- return -1
+ goto step3
endi
print ============== step4
system sh/exec.sh -n dnode4 -s start
sql create dnode $hostname4
-sleep 8000
+$x = 0
+step4:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
sql show mnodes
$dnode1Role = $data2_1
@@ -102,21 +120,27 @@ print dnode3 ==> $dnode3Role
print dnode4 ==> $dnode4Role
if $dnode1Role != master then
- return -1
+ goto step4
endi
if $dnode2Role != slave then
- return -1
+ goto step4
endi
if $dnode3Role != slave then
- return -1
+ goto step4
endi
if $dnode4Role != null then
- return -1
+ goto step4
endi
print ============== step5
sql drop dnode $hostname2
-sleep 8000
+$x = 0
+step5:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
sql show mnodes
$dnode1Role = $data2_1
@@ -129,28 +153,32 @@ print dnode3 ==> $dnode3Role
print dnode4 ==> $dnode4Role
if $dnode1Role != master then
- return -1
+ goto step5
endi
if $dnode2Role != null then
- return -1
+ goto step5
endi
if $dnode3Role != slave then
- return -1
+ goto step5
endi
if $dnode4Role != slave then
- return -1
+ goto step5
endi
system sh/exec.sh -n dnode2 -s stop
-sleep 3000
-
system sh/deploy.sh -n dnode2 -i 2
system sh/cfg.sh -n dnode2 -c numOfMnodes -v 3
system sh/exec.sh -n dnode2 -s start
print ============== step6
sql create dnode $hostname2
-sleep 8000
+$x = 0
+step6:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
sql show mnodes
$dnode1Role = $data2_1
@@ -163,23 +191,29 @@ print dnode3 ==> $dnode3Role
print dnode4 ==> $dnode4Role
if $dnode1Role != master then
- return -1
+ goto step6
endi
if $dnode2Role != null then
- return -1
+ goto step6
endi
if $dnode3Role != slave then
- return -1
+ goto step6
endi
if $dnode4Role != slave then
- return -1
+ goto step6
endi
print ============== step7
system sh/exec.sh -n dnode1 -s stop
-sleep 4000
+$x = 0
+step7:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
-sql show mnodes
+sql show mnodes -x step7
$dnode1Role = $data2_1
$dnode2Role = $data2_2
$dnode3Role = $data2_3
@@ -190,14 +224,19 @@ print dnode3 ==> $dnode3Role
print dnode4 ==> $dnode4Role
if $dnode1Role != offline then
- return -1
+ goto step7
endi
print ============== step8
sql drop dnode $hostname1
-sleep 8000
+step8:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
-sql show mnodes
+sql show mnodes -x step8
$dnode1Role = $data2_1
$dnode2Role = $data2_5
$dnode3Role = $data2_3
@@ -208,10 +247,10 @@ print dnode3 ==> $dnode3Role
print dnode4 ==> $dnode4Role
if $dnode1Role != null then
- return -1
+ goto step8
endi
if $dnode2Role != slave then
- return -1
+ goto step8
endi
#if $dnode3Role != master then
# return -1
diff --git a/tests/script/unique/mnode/mgmtr2.sim b/tests/script/unique/mnode/mgmtr2.sim
index 1fba912d49..0c9f961d25 100644
--- a/tests/script/unique/mnode/mgmtr2.sim
+++ b/tests/script/unique/mnode/mgmtr2.sim
@@ -55,6 +55,14 @@ system sh/exec.sh -n dnode2 -s start
system sh/exec.sh -n dnode3 -s start
print ============== step4
+$x = 0
+step4:
+ $x = $x + 1
+ sleep 1000
+ if $x == 20 then
+ return -1
+ endi
+
sql show mnodes
$dnode1Role = $data2_1
@@ -65,20 +73,15 @@ print dnode2 ==> $dnode2Role
print dnode3 ==> $dnode3Role
if $dnode1Role != master then
- return -1
+ goto step4
endi
if $dnode2Role != slave then
- return -1
+ goto step4
endi
if $dnode3Role != null then
- return -1
+ goto step4
endi
system sh/exec.sh -n dnode1 -s stop -x SIGINT
system sh/exec.sh -n dnode2 -s stop -x SIGINT
-system sh/exec.sh -n dnode3 -s stop -x SIGINT
-system sh/exec.sh -n dnode4 -s stop -x SIGINT
-system sh/exec.sh -n dnode5 -s stop -x SIGINT
-system sh/exec.sh -n dnode6 -s stop -x SIGINT
-system sh/exec.sh -n dnode7 -s stop -x SIGINT
-system sh/exec.sh -n dnode8 -s stop -x SIGINT
\ No newline at end of file
+system sh/exec.sh -n dnode3 -s stop -x SIGINT
\ No newline at end of file
diff --git a/tests/script/unique/vnode/many.sim b/tests/script/unique/vnode/many.sim
index 8bd6372ae9..869c7f8295 100644
--- a/tests/script/unique/vnode/many.sim
+++ b/tests/script/unique/vnode/many.sim
@@ -23,7 +23,37 @@ sql create dnode $hostname2
sql create dnode $hostname3
system sh/exec.sh -n dnode2 -s start
system sh/exec.sh -n dnode3 -s start
-sleep 3000
+$x = 0
+step1:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
+sql show dnodes
+print dnode1 $data4_1
+print dnode2 $data4_2
+print dnode3 $data4_3
+print dnode4 $data4_4
+
+if $data4_1 != ready then
+ goto step1
+endi
+if $data4_2 != ready then
+ goto step1
+endi
+if $data4_3 != ready then
+ goto step1
+endi
+
+sql show mnodes
+print mnode1 $data2_1
+print mnode1 $data2_2
+print mnode1 $data2_3
+if $data2_1 != master then
+ goto step1
+endi
print ========= step1
sql create database db1 replica 2
diff --git a/tests/script/unique/vnode/replica2_repeat.sim b/tests/script/unique/vnode/replica2_repeat.sim
index e862d745d4..5dbb24437d 100644
--- a/tests/script/unique/vnode/replica2_repeat.sim
+++ b/tests/script/unique/vnode/replica2_repeat.sim
@@ -23,7 +23,38 @@ sql create dnode $hostname2
sql create dnode $hostname3
system sh/exec.sh -n dnode2 -s start
system sh/exec.sh -n dnode3 -s start
-sleep 3000
+
+$x = 0
+step1:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
+sql show dnodes
+print dnode1 $data4_1
+print dnode2 $data4_2
+print dnode3 $data4_3
+print dnode4 $data4_4
+
+if $data4_1 != ready then
+ goto step1
+endi
+if $data4_2 != ready then
+ goto step1
+endi
+if $data4_3 != ready then
+ goto step1
+endi
+
+sql show mnodes
+print mnode1 $data2_1
+print mnode1 $data2_2
+print mnode1 $data2_3
+if $data2_1 != master then
+ goto step1
+endi
print ========= step1
sql create database db replica 2
@@ -64,7 +95,7 @@ print ======== step7
$lastRows = $data00
print ======== loop Times $x
-if $x < 5 then
+if $x < 2 then
$x = $x + 1
goto loop
endi
diff --git a/tests/script/unique/vnode/replica3_basic.sim b/tests/script/unique/vnode/replica3_basic.sim
index ab5bebb50d..0ff42b523b 100644
--- a/tests/script/unique/vnode/replica3_basic.sim
+++ b/tests/script/unique/vnode/replica3_basic.sim
@@ -16,14 +16,48 @@ sql create dnode $hostname2
sql create dnode $hostname3
system sh/exec.sh -n dnode2 -s start
system sh/exec.sh -n dnode3 -s start
-sleep 3000
+
+$x = 0
+step1:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
+sql show dnodes
+print dnode1 $data4_1
+print dnode2 $data4_2
+print dnode3 $data4_3
+
+if $data4_1 != ready then
+ goto step1
+endi
+if $data4_2 != ready then
+ goto step1
+endi
+if $data4_3 != ready then
+ goto step1
+endi
+
+sql show mnodes
+print mnode1 $data2_1
+print mnode1 $data2_2
+print mnode1 $data2_3
+if $data2_1 != master then
+ goto step1
+endi
+if $data2_2 != slave then
+ goto step1
+endi
+if $data2_3 != slave then
+ goto step1
+endi
$N = 10
$table = table_r3
$db = db1
-sleep 3000
-
print =================== step 1
sql create database $db replica 3
@@ -66,7 +100,21 @@ endi
print =================== step 4
system sh/exec.sh -n dnode2 -s start
-sleep 2000
+
+$x = 0
+step4:
+ $x = $x + 1
+ sleep 1000
+ if $x == 40 then
+ return -1
+ endi
+
+sql show db1.vgroups
+print online vnodes $data03
+if $data03 != 3 then
+ goto step4
+endi
+
$y = $x + $N
$expect = $N * 3
while $x < $y
@@ -83,7 +131,6 @@ endi
print =================== step 5
system sh/exec.sh -n dnode3 -s stop
-sleep 2000
$y = $x + $N
$expect = $N * 4
while $x < $y
@@ -100,7 +147,21 @@ endi
print =================== step 6
system sh/exec.sh -n dnode3 -s start
-sleep 2000
+
+$x = 0
+step6:
+ $x = $x + 1
+ sleep 1000
+ if $x == 40 then
+ return -1
+ endi
+
+sql show db1.vgroups
+print online vnodes $data03
+if $data03 != 3 then
+ goto step6
+endi
+
$y = $x + $N
$expect = $N * 5
while $x < $y
@@ -117,7 +178,6 @@ endi
print =================== step 7
system sh/exec.sh -n dnode1 -s stop
-sleep 2000
$y = $x + $N
$expect = $N * 6
while $x < $y
@@ -134,7 +194,21 @@ endi
print =================== step 8
system sh/exec.sh -n dnode1 -s start
-sleep 2000
+
+$x = 0
+step8:
+ $x = $x + 1
+ sleep 1000
+ if $x == 40 then
+ return -1
+ endi
+
+sql show db1.vgroups
+print online vnodes $data03
+if $data03 != 3 then
+ goto step8
+endi
+
$y = $x + $N
$expect = $N * 7
while $x < $y
diff --git a/tests/script/unique/vnode/replica3_repeat.sim b/tests/script/unique/vnode/replica3_repeat.sim
index 4b5c852de8..d866fb05d8 100644
--- a/tests/script/unique/vnode/replica3_repeat.sim
+++ b/tests/script/unique/vnode/replica3_repeat.sim
@@ -26,7 +26,42 @@ sql create dnode $hostname4
system sh/exec.sh -n dnode2 -s start
system sh/exec.sh -n dnode3 -s start
system sh/exec.sh -n dnode4 -s start
-sleep 3000
+
+
+$x = 0
+step1:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+
+sql show dnodes
+print dnode1 $data4_1
+print dnode2 $data4_2
+print dnode3 $data4_3
+print dnode4 $data4_4
+
+if $data4_1 != ready then
+ goto step1
+endi
+if $data4_2 != ready then
+ goto step1
+endi
+if $data4_3 != ready then
+ goto step1
+endi
+if $data4_4 != ready then
+ goto step1
+endi
+
+sql show mnodes
+print mnode1 $data2_1
+print mnode1 $data2_2
+print mnode1 $data2_3
+if $data2_1 != master then
+ goto step1
+endi
print ========= step1
sql create database db replica 3
@@ -75,7 +110,7 @@ print ======== step8
$lastRows = $data00
print ======== loop Times $x
-if $x < 5 then
+if $x < 2 then
$x = $x + 1
goto loop
endi
diff --git a/tests/test-all.sh b/tests/test-all.sh
index 4448c8a2a4..a85ac39b44 100755
--- a/tests/test-all.sh
+++ b/tests/test-all.sh
@@ -31,11 +31,17 @@ function runSimCaseOneByOnefq {
case=`echo $line | grep sim$ |awk '{print $NF}'`
start_time=`date +%s`
- ./test.sh -f $case > /dev/null 2>&1 && \
+ IN_TDINTERNAL="community"
+ if [[ "$tests_dir" == *"$IN_TDINTERNAL"* ]]; then
+ ./test.sh -f $case > /dev/null 2>&1 && \
echo -e "${GREEN}$case success${NC}" | tee -a out.log || \
( grep 'script.*success.*m$' ../../../sim/tsim/log/taoslog0.0 && echo -e "${GREEN}$case success${NC}" | tee -a out.log ) || echo -e "${RED}$case failed${NC}" | tee -a out.log
-
-
+ else
+ ./test.sh -f $case > /dev/null 2>&1 && \
+ echo -e "${GREEN}$case success${NC}" | tee -a out.log || \
+ ( grep 'script.*success.*m$' ../../sim/tsim/log/taoslog0.0 && echo -e "${GREEN}$case success${NC}" | tee -a out.log ) || echo -e "${RED}$case failed${NC}" | tee -a out.log
+ fi
+
out_log=`tail -1 out.log `
if [[ $out_log =~ 'failed' ]];then
exit 8
@@ -196,10 +202,10 @@ if [ "$2" != "sim" ]; then
runPyCaseOneByOnefq fulltest.sh
elif [ "$1" == "p1" ]; then
echo "### run Python_1 test ###"
- runPyCaseOneByOne pytest_1.sh
+ runPyCaseOneByOnefq pytest_1.sh
elif [ "$1" == "p2" ]; then
echo "### run Python_2 test ###"
- runPyCaseOneByOne pytest_2.sh
+ runPyCaseOneByOnefq pytest_2.sh
elif [ "$1" == "b2" ] || [ "$1" == "b3" ]; then
exit $(($totalFailed + $totalPyFailed))
elif [ "$1" == "smoke" ] || [ -z "$1" ]; then