提交 4d774efc 编写于 作者: E Elias Soong

Merge branch 'develop' into docs/Update-Latest-Feature

...@@ -79,3 +79,15 @@ tests/comparisonTest/opentsdb/opentsdbtest/.settings/ ...@@ -79,3 +79,15 @@ tests/comparisonTest/opentsdb/opentsdbtest/.settings/
tests/examples/JDBC/JDBCDemo/.classpath tests/examples/JDBC/JDBCDemo/.classpath
tests/examples/JDBC/JDBCDemo/.project tests/examples/JDBC/JDBCDemo/.project
tests/examples/JDBC/JDBCDemo/.settings/ tests/examples/JDBC/JDBCDemo/.settings/
# Emacs
# -*- mode: gitignore; -*-
*~
\#*\#
/.emacs.desktop
/.emacs.desktop.lock
*.elc
auto-save-list
tramp
.\#*
TAGS
...@@ -4,9 +4,9 @@ ...@@ -4,9 +4,9 @@
[submodule "src/connector/grafanaplugin"] [submodule "src/connector/grafanaplugin"]
path = src/connector/grafanaplugin path = src/connector/grafanaplugin
url = https://github.com/taosdata/grafanaplugin url = https://github.com/taosdata/grafanaplugin
[submodule "src/connector/hivemq-tdengine-extension"]
path = src/connector/hivemq-tdengine-extension
url = https://github.com/huskar-t/hivemq-tdengine-extension.git
[submodule "tests/examples/rust"] [submodule "tests/examples/rust"]
path = tests/examples/rust path = tests/examples/rust
url = https://github.com/songtianyi/tdengine-rust-bindings.git url = https://github.com/songtianyi/tdengine-rust-bindings.git
[submodule "src/connector/hivemq-tdengine-extension"]
path = src/connector/hivemq-tdengine-extension
url = https://github.com/huskar-t/hivemq-tdengine-extension.git
\ No newline at end of file
...@@ -5,7 +5,7 @@ node { ...@@ -5,7 +5,7 @@ node {
git url: 'https://github.com/taosdata/TDengine.git' git url: 'https://github.com/taosdata/TDengine.git'
} }
def kipstage=0 def skipstage=0
def abortPreviousBuilds() { def abortPreviousBuilds() {
def currentJobName = env.JOB_NAME def currentJobName = env.JOB_NAME
def currentBuildNumber = env.BUILD_NUMBER.toInteger() def currentBuildNumber = env.BUILD_NUMBER.toInteger()
...@@ -88,8 +88,9 @@ pipeline { ...@@ -88,8 +88,9 @@ pipeline {
git checkout -qf FETCH_HEAD git checkout -qf FETCH_HEAD
''' '''
script{ script{
skipstage=sh(script:"git --no-pager diff --name-only FETCH_HEAD develop|grep -v -E '.*md|//src//connector|Jenkinsfile|test-all.sh' || echo 0 ",returnStdout:true) env.skipstage=sh(script:"cd ${WORKSPACE}.tes && git --no-pager diff --name-only FETCH_HEAD develop|grep -v -E '.*md|//src//connector|Jenkinsfile|test-all.sh' || echo 0 ",returnStdout:true)
} }
println env.skipstage
sh''' sh'''
rm -rf ${WORKSPACE}.tes rm -rf ${WORKSPACE}.tes
''' '''
...@@ -101,7 +102,7 @@ pipeline { ...@@ -101,7 +102,7 @@ pipeline {
when { when {
changeRequest() changeRequest()
expression { expression {
skipstage != 0 env.skipstage != 0
} }
} }
parallel { parallel {
......
...@@ -4,7 +4,7 @@ PROJECT(TDengine) ...@@ -4,7 +4,7 @@ PROJECT(TDengine)
IF (DEFINED VERNUMBER) IF (DEFINED VERNUMBER)
SET(TD_VER_NUMBER ${VERNUMBER}) SET(TD_VER_NUMBER ${VERNUMBER})
ELSE () ELSE ()
SET(TD_VER_NUMBER "2.0.14.0") SET(TD_VER_NUMBER "2.0.16.0")
ENDIF () ENDIF ()
IF (DEFINED VERCOMPATIBLE) IF (DEFINED VERCOMPATIBLE)
......
...@@ -362,24 +362,6 @@ TDengine缺省的时间戳是毫秒精度,但通过修改配置参数enableMic ...@@ -362,24 +362,6 @@ TDengine缺省的时间戳是毫秒精度,但通过修改配置参数enableMic
**历史记录写入**:可使用IMPORT或者INSERT命令,IMPORT的语法,功能与INSERT完全一样。 **历史记录写入**:可使用IMPORT或者INSERT命令,IMPORT的语法,功能与INSERT完全一样。
## <a class="anchor" id="select"></a>数据查询
### 查询语法:
```mysql
SELECT select_expr [, select_expr ...]
FROM {tb_name_list}
[WHERE where_condition]
[INTERVAL (interval_val [, interval_offset])]
[FILL fill_val]
[SLIDING fill_val]
[GROUP BY col_list]
[ORDER BY col_list { DESC | ASC }]
[SLIMIT limit_val [, SOFFSET offset_val]]
[LIMIT limit_val [, OFFSET offset_val]]
[>> export_file];
```
说明:针对 insert 类型的 SQL 语句,我们采用的流式解析策略,在发现后面的错误之前,前面正确的部分SQL仍会执行。下面的sql中,insert语句是无效的,但是d1001仍会被创建。 说明:针对 insert 类型的 SQL 语句,我们采用的流式解析策略,在发现后面的错误之前,前面正确的部分SQL仍会执行。下面的sql中,insert语句是无效的,但是d1001仍会被创建。
```mysql ```mysql
...@@ -406,6 +388,24 @@ taos> SHOW TABLES; ...@@ -406,6 +388,24 @@ taos> SHOW TABLES;
Query OK, 1 row(s) in set (0.001091s) Query OK, 1 row(s) in set (0.001091s)
``` ```
## <a class="anchor" id="select"></a>数据查询
### 查询语法:
```mysql
SELECT select_expr [, select_expr ...]
FROM {tb_name_list}
[WHERE where_condition]
[INTERVAL (interval_val [, interval_offset])]
[FILL fill_val]
[SLIDING fill_val]
[GROUP BY col_list]
[ORDER BY col_list { DESC | ASC }]
[SLIMIT limit_val [, SOFFSET offset_val]]
[LIMIT limit_val [, OFFSET offset_val]]
[>> export_file];
```
#### SELECT子句 #### SELECT子句
一个选择子句可以是联合查询(UNION)和另一个查询的子查询(SUBQUERY)。 一个选择子句可以是联合查询(UNION)和另一个查询的子查询(SUBQUERY)。
......
...@@ -35,10 +35,11 @@ done ...@@ -35,10 +35,11 @@ done
echo "verNumber=${verNumber}" echo "verNumber=${verNumber}"
docker manifest create -a tdengine/tdengine:${verNumber} tdengine/tdengine-amd64:${verNumber} tdengine/tdengine-aarch64:${verNumber} tdengine/tdengine-aarch32:${verNumber} #docker manifest create -a tdengine/tdengine:${verNumber} tdengine/tdengine-amd64:${verNumber} tdengine/tdengine-aarch64:${verNumber} tdengine/tdengine-aarch32:${verNumber}
docker manifest create -a tdengine/tdengine tdengine/tdengine-amd64:latest tdengine/tdengine-aarch64:latest tdengine/tdengine-aarch32:latest
docker login -u tdengine -p ${passWord} #replace the docker registry username and password docker login -u tdengine -p ${passWord} #replace the docker registry username and password
docker manifest push tdengine/tdengine:${verNumber} docker manifest push tdengine/tdengine
# how set latest version ??? # how set latest version ???
...@@ -9,6 +9,7 @@ Summary: tdengine from taosdata ...@@ -9,6 +9,7 @@ Summary: tdengine from taosdata
Group: Application/Database Group: Application/Database
License: AGPL License: AGPL
URL: www.taosdata.com URL: www.taosdata.com
AutoReqProv: no
#BuildRoot: %_topdir/BUILDROOT #BuildRoot: %_topdir/BUILDROOT
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
......
name: tdengine name: tdengine
base: core18 base: core18
version: '2.0.14.0' version: '2.0.16.0'
icon: snap/gui/t-dengine.svg icon: snap/gui/t-dengine.svg
summary: an open-source big data platform designed and optimized for IoT. summary: an open-source big data platform designed and optimized for IoT.
description: | description: |
...@@ -72,7 +72,7 @@ parts: ...@@ -72,7 +72,7 @@ parts:
- usr/bin/taosd - usr/bin/taosd
- usr/bin/taos - usr/bin/taos
- usr/bin/taosdemo - usr/bin/taosdemo
- usr/lib/libtaos.so.2.0.14.0 - usr/lib/libtaos.so.2.0.16.0
- usr/lib/libtaos.so.1 - usr/lib/libtaos.so.1
- usr/lib/libtaos.so - usr/lib/libtaos.so
......
...@@ -6375,16 +6375,14 @@ int32_t doCheckForCreateFromStable(SSqlObj* pSql, SSqlInfo* pInfo) { ...@@ -6375,16 +6375,14 @@ int32_t doCheckForCreateFromStable(SSqlObj* pSql, SSqlInfo* pInfo) {
// get table meta from mnode // get table meta from mnode
code = tNameExtractFullName(&pStableMetaInfo->name, pCreateTableInfo->tagdata.name); code = tNameExtractFullName(&pStableMetaInfo->name, pCreateTableInfo->tagdata.name);
SArray* pList = pCreateTableInfo->pTagVals; SArray* pValList = pCreateTableInfo->pTagVals;
code = tscGetTableMeta(pSql, pStableMetaInfo); code = tscGetTableMeta(pSql, pStableMetaInfo);
if (code != TSDB_CODE_SUCCESS) { if (code != TSDB_CODE_SUCCESS) {
return code; return code;
} }
size_t size = taosArrayGetSize(pList); size_t valSize = taosArrayGetSize(pValList);
if (tscGetNumOfTags(pStableMetaInfo->pTableMeta) != size) {
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg5);
}
// too long tag values will return invalid sql, not be truncated automatically // too long tag values will return invalid sql, not be truncated automatically
SSchema *pTagSchema = tscGetTableTagSchema(pStableMetaInfo->pTableMeta); SSchema *pTagSchema = tscGetTableTagSchema(pStableMetaInfo->pTableMeta);
...@@ -6395,36 +6393,111 @@ int32_t doCheckForCreateFromStable(SSqlObj* pSql, SSqlInfo* pInfo) { ...@@ -6395,36 +6393,111 @@ int32_t doCheckForCreateFromStable(SSqlObj* pSql, SSqlInfo* pInfo) {
return TSDB_CODE_TSC_OUT_OF_MEMORY; return TSDB_CODE_TSC_OUT_OF_MEMORY;
} }
SArray* pNameList = NULL;
size_t nameSize = 0;
int32_t schemaSize = tscGetNumOfTags(pStableMetaInfo->pTableMeta);
int32_t ret = TSDB_CODE_SUCCESS; int32_t ret = TSDB_CODE_SUCCESS;
for (int32_t i = 0; i < size; ++i) {
SSchema* pSchema = &pTagSchema[i];
tVariantListItem* pItem = taosArrayGet(pList, i);
char tagVal[TSDB_MAX_TAGS_LEN]; if (pCreateTableInfo->pTagNames) {
if (pSchema->type == TSDB_DATA_TYPE_BINARY || pSchema->type == TSDB_DATA_TYPE_NCHAR) { pNameList = pCreateTableInfo->pTagNames;
if (pItem->pVar.nLen > pSchema->bytes) { nameSize = taosArrayGetSize(pNameList);
tdDestroyKVRowBuilder(&kvRowBuilder);
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg3); if (valSize != nameSize) {
} return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg5);
} }
ret = tVariantDump(&(pItem->pVar), tagVal, pSchema->type, true); if (schemaSize < valSize) {
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg5);
}
// check again after the convert since it may be converted from binary to nchar. bool findColumnIndex = false;
if (pSchema->type == TSDB_DATA_TYPE_BINARY || pSchema->type == TSDB_DATA_TYPE_NCHAR) {
int16_t len = varDataTLen(tagVal); for (int32_t i = 0; i < nameSize; ++i) {
if (len > pSchema->bytes) { SStrToken* sToken = taosArrayGet(pNameList, i);
tdDestroyKVRowBuilder(&kvRowBuilder); if (TK_STRING == sToken->type) {
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg3); tscDequoteAndTrimToken(sToken);
} }
}
if (ret != TSDB_CODE_SUCCESS) { tVariantListItem* pItem = taosArrayGet(pValList, i);
tdDestroyKVRowBuilder(&kvRowBuilder);
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg4); findColumnIndex = false;
// todo speedup by using hash list
for (int32_t t = 0; t < schemaSize; ++t) {
if (strncmp(sToken->z, pTagSchema[t].name, sToken->n) == 0 && strlen(pTagSchema[t].name) == sToken->n) {
SSchema* pSchema = &pTagSchema[t];
char tagVal[TSDB_MAX_TAGS_LEN];
if (pSchema->type == TSDB_DATA_TYPE_BINARY || pSchema->type == TSDB_DATA_TYPE_NCHAR) {
if (pItem->pVar.nLen > pSchema->bytes) {
tdDestroyKVRowBuilder(&kvRowBuilder);
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg3);
}
}
ret = tVariantDump(&(pItem->pVar), tagVal, pSchema->type, true);
// check again after the convert since it may be converted from binary to nchar.
if (pSchema->type == TSDB_DATA_TYPE_BINARY || pSchema->type == TSDB_DATA_TYPE_NCHAR) {
int16_t len = varDataTLen(tagVal);
if (len > pSchema->bytes) {
tdDestroyKVRowBuilder(&kvRowBuilder);
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg3);
}
}
if (ret != TSDB_CODE_SUCCESS) {
tdDestroyKVRowBuilder(&kvRowBuilder);
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg4);
}
tdAddColToKVRow(&kvRowBuilder, pSchema->colId, pSchema->type, tagVal);
findColumnIndex = true;
break;
}
}
if (!findColumnIndex) {
return tscInvalidSQLErrMsg(pCmd->payload, "invalid tag name", sToken->z);
}
}
} else {
if (schemaSize != valSize) {
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg5);
} }
tdAddColToKVRow(&kvRowBuilder, pSchema->colId, pSchema->type, tagVal); for (int32_t i = 0; i < valSize; ++i) {
SSchema* pSchema = &pTagSchema[i];
tVariantListItem* pItem = taosArrayGet(pValList, i);
char tagVal[TSDB_MAX_TAGS_LEN];
if (pSchema->type == TSDB_DATA_TYPE_BINARY || pSchema->type == TSDB_DATA_TYPE_NCHAR) {
if (pItem->pVar.nLen > pSchema->bytes) {
tdDestroyKVRowBuilder(&kvRowBuilder);
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg3);
}
}
ret = tVariantDump(&(pItem->pVar), tagVal, pSchema->type, true);
// check again after the convert since it may be converted from binary to nchar.
if (pSchema->type == TSDB_DATA_TYPE_BINARY || pSchema->type == TSDB_DATA_TYPE_NCHAR) {
int16_t len = varDataTLen(tagVal);
if (len > pSchema->bytes) {
tdDestroyKVRowBuilder(&kvRowBuilder);
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg3);
}
}
if (ret != TSDB_CODE_SUCCESS) {
tdDestroyKVRowBuilder(&kvRowBuilder);
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg4);
}
tdAddColToKVRow(&kvRowBuilder, pSchema->colId, pSchema->type, tagVal);
}
} }
SKVRow row = tdGetKVRowFromBuilder(&kvRowBuilder); SKVRow row = tdGetKVRowFromBuilder(&kvRowBuilder);
......
...@@ -52,7 +52,9 @@ static bool validPassword(const char* passwd) { ...@@ -52,7 +52,9 @@ static bool validPassword(const char* passwd) {
static SSqlObj *taosConnectImpl(const char *ip, const char *user, const char *pass, const char *auth, const char *db, static SSqlObj *taosConnectImpl(const char *ip, const char *user, const char *pass, const char *auth, const char *db,
uint16_t port, void (*fp)(void *, TAOS_RES *, int), void *param, TAOS **taos) { uint16_t port, void (*fp)(void *, TAOS_RES *, int), void *param, TAOS **taos) {
taos_init(); if (taos_init()) {
return NULL;
}
if (!validUserName(user)) { if (!validUserName(user)) {
terrno = TSDB_CODE_TSC_INVALID_USER_LENGTH; terrno = TSDB_CODE_TSC_INVALID_USER_LENGTH;
......
...@@ -47,6 +47,7 @@ void *tscRpcCache; // cache to keep rpc obj ...@@ -47,6 +47,7 @@ void *tscRpcCache; // cache to keep rpc obj
int32_t tscNumOfThreads = 1; // num of rpc threads int32_t tscNumOfThreads = 1; // num of rpc threads
static pthread_mutex_t rpcObjMutex; // mutex to protect open the rpc obj concurrently static pthread_mutex_t rpcObjMutex; // mutex to protect open the rpc obj concurrently
static pthread_once_t tscinit = PTHREAD_ONCE_INIT; static pthread_once_t tscinit = PTHREAD_ONCE_INIT;
static volatile int tscInitRes = 0;
void tscCheckDiskUsage(void *UNUSED_PARAM(para), void *UNUSED_PARAM(param)) { void tscCheckDiskUsage(void *UNUSED_PARAM(para), void *UNUSED_PARAM(param)) {
taosGetDisk(); taosGetDisk();
...@@ -137,7 +138,11 @@ void taos_init_imp(void) { ...@@ -137,7 +138,11 @@ void taos_init_imp(void) {
} }
taosReadGlobalCfg(); taosReadGlobalCfg();
taosCheckGlobalCfg(); if (taosCheckGlobalCfg()) {
tscInitRes = -1;
return;
}
taosInitNotes(); taosInitNotes();
rpcInit(); rpcInit();
...@@ -159,6 +164,7 @@ void taos_init_imp(void) { ...@@ -159,6 +164,7 @@ void taos_init_imp(void) {
tscQhandle = taosInitScheduler(queueSize, tscNumOfThreads, "tsc"); tscQhandle = taosInitScheduler(queueSize, tscNumOfThreads, "tsc");
if (NULL == tscQhandle) { if (NULL == tscQhandle) {
tscError("failed to init scheduler"); tscError("failed to init scheduler");
tscInitRes = -1;
return; return;
} }
...@@ -187,7 +193,7 @@ void taos_init_imp(void) { ...@@ -187,7 +193,7 @@ void taos_init_imp(void) {
tscDebug("client is initialized successfully"); tscDebug("client is initialized successfully");
} }
void taos_init() { pthread_once(&tscinit, taos_init_imp); } int taos_init() { pthread_once(&tscinit, taos_init_imp); return tscInitRes;}
// this function may be called by user or system, or by both simultaneously. // this function may be called by user or system, or by both simultaneously.
void taos_cleanup(void) { void taos_cleanup(void) {
......
...@@ -373,6 +373,23 @@ static void taosCheckDataDirCfg() { ...@@ -373,6 +373,23 @@ static void taosCheckDataDirCfg() {
} }
} }
static int32_t taosCheckTmpDir(void) {
if (strlen(tsTempDir) <= 0){
uError("tempDir is not set");
return -1;
}
DIR *dir = opendir(tsTempDir);
if (dir == NULL) {
uError("can not open tempDir:%s, error:%s", tsTempDir, strerror(errno));
return -1;
}
closedir(dir);
return 0;
}
static void doInitGlobalConfig(void) { static void doInitGlobalConfig(void) {
osInit(); osInit();
srand(taosSafeRand()); srand(taosSafeRand());
...@@ -1488,6 +1505,11 @@ int32_t taosCheckGlobalCfg() { ...@@ -1488,6 +1505,11 @@ int32_t taosCheckGlobalCfg() {
} }
taosCheckDataDirCfg(); taosCheckDataDirCfg();
if (taosCheckTmpDir()) {
return -1;
}
taosGetSystemInfo(); taosGetSystemInfo();
tsSetLocale(); tsSetLocale();
......
...@@ -5,7 +5,7 @@ with open("README.md", "r") as fh: ...@@ -5,7 +5,7 @@ with open("README.md", "r") as fh:
setuptools.setup( setuptools.setup(
name="taos", name="taos",
version="2.0.5", version="2.0.6",
author="Taosdata Inc.", author="Taosdata Inc.",
author_email="support@taosdata.com", author_email="support@taosdata.com",
description="TDengine python client package", description="TDengine python client package",
......
...@@ -3,12 +3,12 @@ from .connection import TDengineConnection ...@@ -3,12 +3,12 @@ from .connection import TDengineConnection
from .cursor import TDengineCursor from .cursor import TDengineCursor
# Globals # Globals
apilevel = '2.0.3'
threadsafety = 0 threadsafety = 0
paramstyle = 'pyformat' paramstyle = 'pyformat'
__all__ = ['connection', 'cursor'] __all__ = ['connection', 'cursor']
def connect(*args, **kwargs): def connect(*args, **kwargs):
""" Function to return a TDengine connector object """ Function to return a TDengine connector object
...@@ -21,4 +21,4 @@ def connect(*args, **kwargs): ...@@ -21,4 +21,4 @@ def connect(*args, **kwargs):
@rtype: TDengineConnector @rtype: TDengineConnector
""" """
return TDengineConnection(*args, **kwargs) return TDengineConnection(*args, **kwargs)
\ No newline at end of file
...@@ -4,11 +4,14 @@ from .error import * ...@@ -4,11 +4,14 @@ from .error import *
import math import math
import datetime import datetime
def _convert_millisecond_to_datetime(milli): def _convert_millisecond_to_datetime(milli):
return datetime.datetime.fromtimestamp(milli/1000.0) return datetime.datetime.fromtimestamp(milli / 1000.0)
def _convert_microsecond_to_datetime(micro): def _convert_microsecond_to_datetime(micro):
return datetime.datetime.fromtimestamp(micro/1000000.0) return datetime.datetime.fromtimestamp(micro / 1000000.0)
def _crow_timestamp_to_python(data, num_of_rows, nbytes=None, micro=False): def _crow_timestamp_to_python(data, num_of_rows, nbytes=None, micro=False):
"""Function to convert C bool row to python row """Function to convert C bool row to python row
...@@ -18,168 +21,309 @@ def _crow_timestamp_to_python(data, num_of_rows, nbytes=None, micro=False): ...@@ -18,168 +21,309 @@ def _crow_timestamp_to_python(data, num_of_rows, nbytes=None, micro=False):
_timestamp_converter = _convert_microsecond_to_datetime _timestamp_converter = _convert_microsecond_to_datetime
if num_of_rows > 0: if num_of_rows > 0:
return list(map(_timestamp_converter, ctypes.cast(data, ctypes.POINTER(ctypes.c_long))[:abs(num_of_rows)])) return list(map(_timestamp_converter, ctypes.cast(
data, ctypes.POINTER(ctypes.c_long))[:abs(num_of_rows)]))
else: else:
return list(map(_timestamp_converter, ctypes.cast(data, ctypes.POINTER(ctypes.c_long))[:abs(num_of_rows)])) return list(map(_timestamp_converter, ctypes.cast(
data, ctypes.POINTER(ctypes.c_long))[:abs(num_of_rows)]))
def _crow_bool_to_python(data, num_of_rows, nbytes=None, micro=False): def _crow_bool_to_python(data, num_of_rows, nbytes=None, micro=False):
"""Function to convert C bool row to python row """Function to convert C bool row to python row
""" """
if num_of_rows > 0: if num_of_rows > 0:
return [ None if ele == FieldType.C_BOOL_NULL else bool(ele) for ele in ctypes.cast(data, ctypes.POINTER(ctypes.c_byte))[:abs(num_of_rows)] ] return [
None if ele == FieldType.C_BOOL_NULL else bool(ele) for ele in ctypes.cast(
data, ctypes.POINTER(
ctypes.c_byte))[
:abs(num_of_rows)]]
else: else:
return [ None if ele == FieldType.C_BOOL_NULL else bool(ele) for ele in ctypes.cast(data, ctypes.POINTER(ctypes.c_bool))[:abs(num_of_rows)] ] return [
None if ele == FieldType.C_BOOL_NULL else bool(ele) for ele in ctypes.cast(
data, ctypes.POINTER(
ctypes.c_bool))[
:abs(num_of_rows)]]
def _crow_tinyint_to_python(data, num_of_rows, nbytes=None, micro=False): def _crow_tinyint_to_python(data, num_of_rows, nbytes=None, micro=False):
"""Function to convert C tinyint row to python row """Function to convert C tinyint row to python row
""" """
if num_of_rows > 0: if num_of_rows > 0:
return [ None if ele == FieldType.C_TINYINT_NULL else ele for ele in ctypes.cast(data, ctypes.POINTER(ctypes.c_byte))[:abs(num_of_rows)] ] return [None if ele == FieldType.C_TINYINT_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(ctypes.c_byte))[:abs(num_of_rows)]]
else:
return [None if ele == FieldType.C_TINYINT_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(ctypes.c_byte))[:abs(num_of_rows)]]
def _crow_tinyint_unsigned_to_python(
data,
num_of_rows,
nbytes=None,
micro=False):
"""Function to convert C tinyint row to python row
"""
if num_of_rows > 0:
return [
None if ele == FieldType.C_TINYINT_UNSIGNED_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(
ctypes.c_byte))[
:abs(num_of_rows)]]
else: else:
return [ None if ele == FieldType.C_TINYINT_NULL else ele for ele in ctypes.cast(data, ctypes.POINTER(ctypes.c_byte))[:abs(num_of_rows)] ] return [
None if ele == FieldType.C_TINYINT_UNSIGNED_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(
ctypes.c_byte))[
:abs(num_of_rows)]]
def _crow_smallint_to_python(data, num_of_rows, nbytes=None, micro=False): def _crow_smallint_to_python(data, num_of_rows, nbytes=None, micro=False):
"""Function to convert C smallint row to python row """Function to convert C smallint row to python row
""" """
if num_of_rows > 0: if num_of_rows > 0:
return [ None if ele == FieldType.C_SMALLINT_NULL else ele for ele in ctypes.cast(data, ctypes.POINTER(ctypes.c_short))[:abs(num_of_rows)]] return [
None if ele == FieldType.C_SMALLINT_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(
ctypes.c_short))[
:abs(num_of_rows)]]
else:
return [
None if ele == FieldType.C_SMALLINT_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(
ctypes.c_short))[
:abs(num_of_rows)]]
def _crow_smallint_unsigned_to_python(
data, num_of_rows, nbytes=None, micro=False):
"""Function to convert C smallint row to python row
"""
if num_of_rows > 0:
return [
None if ele == FieldType.C_SMALLINT_UNSIGNED_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(
ctypes.c_short))[
:abs(num_of_rows)]]
else: else:
return [ None if ele == FieldType.C_SMALLINT_NULL else ele for ele in ctypes.cast(data, ctypes.POINTER(ctypes.c_short))[:abs(num_of_rows)] ] return [
None if ele == FieldType.C_SMALLINT_UNSIGNED_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(
ctypes.c_short))[
:abs(num_of_rows)]]
def _crow_int_to_python(data, num_of_rows, nbytes=None, micro=False): def _crow_int_to_python(data, num_of_rows, nbytes=None, micro=False):
"""Function to convert C int row to python row """Function to convert C int row to python row
""" """
if num_of_rows > 0: if num_of_rows > 0:
return [ None if ele == FieldType.C_INT_NULL else ele for ele in ctypes.cast(data, ctypes.POINTER(ctypes.c_int))[:abs(num_of_rows)] ] return [None if ele == FieldType.C_INT_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(ctypes.c_int))[:abs(num_of_rows)]]
else:
return [None if ele == FieldType.C_INT_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(ctypes.c_int))[:abs(num_of_rows)]]
def _crow_int_unsigned_to_python(data, num_of_rows, nbytes=None, micro=False):
"""Function to convert C int row to python row
"""
if num_of_rows > 0:
return [
None if ele == FieldType.C_INT_UNSIGNED_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(
ctypes.c_int))[
:abs(num_of_rows)]]
else: else:
return [ None if ele == FieldType.C_INT_NULL else ele for ele in ctypes.cast(data, ctypes.POINTER(ctypes.c_int))[:abs(num_of_rows)] ] return [
None if ele == FieldType.C_INT_UNSIGNED_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(
ctypes.c_int))[
:abs(num_of_rows)]]
def _crow_bigint_to_python(data, num_of_rows, nbytes=None, micro=False): def _crow_bigint_to_python(data, num_of_rows, nbytes=None, micro=False):
"""Function to convert C bigint row to python row """Function to convert C bigint row to python row
""" """
if num_of_rows > 0: if num_of_rows > 0:
return [ None if ele == FieldType.C_BIGINT_NULL else ele for ele in ctypes.cast(data, ctypes.POINTER(ctypes.c_long))[:abs(num_of_rows)] ] return [None if ele == FieldType.C_BIGINT_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(ctypes.c_long))[:abs(num_of_rows)]]
else:
return [None if ele == FieldType.C_BIGINT_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(ctypes.c_long))[:abs(num_of_rows)]]
def _crow_bigint_unsigned_to_python(
data,
num_of_rows,
nbytes=None,
micro=False):
"""Function to convert C bigint row to python row
"""
if num_of_rows > 0:
return [
None if ele == FieldType.C_BIGINT_UNSIGNED_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(
ctypes.c_long))[
:abs(num_of_rows)]]
else: else:
return [ None if ele == FieldType.C_BIGINT_NULL else ele for ele in ctypes.cast(data, ctypes.POINTER(ctypes.c_long))[:abs(num_of_rows)] ] return [
None if ele == FieldType.C_BIGINT_UNSIGNED_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(
ctypes.c_long))[
:abs(num_of_rows)]]
def _crow_float_to_python(data, num_of_rows, nbytes=None, micro=False): def _crow_float_to_python(data, num_of_rows, nbytes=None, micro=False):
"""Function to convert C float row to python row """Function to convert C float row to python row
""" """
if num_of_rows > 0: if num_of_rows > 0:
return [ None if math.isnan(ele) else ele for ele in ctypes.cast(data, ctypes.POINTER(ctypes.c_float))[:abs(num_of_rows)] ] return [None if math.isnan(ele) else ele for ele in ctypes.cast(
data, ctypes.POINTER(ctypes.c_float))[:abs(num_of_rows)]]
else: else:
return [ None if math.isnan(ele) else ele for ele in ctypes.cast(data, ctypes.POINTER(ctypes.c_float))[:abs(num_of_rows)] ] return [None if math.isnan(ele) else ele for ele in ctypes.cast(
data, ctypes.POINTER(ctypes.c_float))[:abs(num_of_rows)]]
def _crow_double_to_python(data, num_of_rows, nbytes=None, micro=False): def _crow_double_to_python(data, num_of_rows, nbytes=None, micro=False):
"""Function to convert C double row to python row """Function to convert C double row to python row
""" """
if num_of_rows > 0: if num_of_rows > 0:
return [ None if math.isnan(ele) else ele for ele in ctypes.cast(data, ctypes.POINTER(ctypes.c_double))[:abs(num_of_rows)] ] return [None if math.isnan(ele) else ele for ele in ctypes.cast(
data, ctypes.POINTER(ctypes.c_double))[:abs(num_of_rows)]]
else: else:
return [ None if math.isnan(ele) else ele for ele in ctypes.cast(data, ctypes.POINTER(ctypes.c_double))[:abs(num_of_rows)] ] return [None if math.isnan(ele) else ele for ele in ctypes.cast(
data, ctypes.POINTER(ctypes.c_double))[:abs(num_of_rows)]]
def _crow_binary_to_python(data, num_of_rows, nbytes=None, micro=False): def _crow_binary_to_python(data, num_of_rows, nbytes=None, micro=False):
"""Function to convert C binary row to python row """Function to convert C binary row to python row
""" """
assert(nbytes is not None) assert(nbytes is not None)
if num_of_rows > 0: if num_of_rows > 0:
return [ None if ele.value[0:1] == FieldType.C_BINARY_NULL else ele.value.decode('utf-8') for ele in (ctypes.cast(data, ctypes.POINTER(ctypes.c_char * nbytes)))[:abs(num_of_rows)]] return [None if ele.value[0:1] == FieldType.C_BINARY_NULL else ele.value.decode(
'utf-8') for ele in (ctypes.cast(data, ctypes.POINTER(ctypes.c_char * nbytes)))[:abs(num_of_rows)]]
else: else:
return [ None if ele.value[0:1] == FieldType.C_BINARY_NULL else ele.value.decode('utf-8') for ele in (ctypes.cast(data, ctypes.POINTER(ctypes.c_char * nbytes)))[:abs(num_of_rows)]] return [None if ele.value[0:1] == FieldType.C_BINARY_NULL else ele.value.decode(
'utf-8') for ele in (ctypes.cast(data, ctypes.POINTER(ctypes.c_char * nbytes)))[:abs(num_of_rows)]]
def _crow_nchar_to_python(data, num_of_rows, nbytes=None, micro=False): def _crow_nchar_to_python(data, num_of_rows, nbytes=None, micro=False):
"""Function to convert C nchar row to python row """Function to convert C nchar row to python row
""" """
assert(nbytes is not None) assert(nbytes is not None)
res=[] res = []
for i in range(abs(num_of_rows)): for i in range(abs(num_of_rows)):
try: try:
if num_of_rows >= 0: if num_of_rows >= 0:
tmpstr = ctypes.c_char_p(data) tmpstr = ctypes.c_char_p(data)
res.append( tmpstr.value.decode() ) res.append(tmpstr.value.decode())
else: else:
res.append( (ctypes.cast(data+nbytes*i, ctypes.POINTER(ctypes.c_wchar * (nbytes//4))))[0].value ) res.append((ctypes.cast(data + nbytes * i,
ctypes.POINTER(ctypes.c_wchar * (nbytes // 4))))[0].value)
except ValueError: except ValueError:
res.append(None) res.append(None)
return res return res
def _crow_binary_to_python_block(data, num_of_rows, nbytes=None, micro=False): def _crow_binary_to_python_block(data, num_of_rows, nbytes=None, micro=False):
"""Function to convert C binary row to python row """Function to convert C binary row to python row
""" """
assert(nbytes is not None) assert(nbytes is not None)
res=[] res = []
if num_of_rows > 0: if num_of_rows > 0:
for i in range(abs(num_of_rows)): for i in range(abs(num_of_rows)):
try: try:
rbyte=ctypes.cast(data+nbytes*i,ctypes.POINTER(ctypes.c_short))[:1].pop() rbyte = ctypes.cast(
tmpstr = ctypes.c_char_p(data+nbytes*i+2) data + nbytes * i,
res.append( tmpstr.value.decode()[0:rbyte] ) ctypes.POINTER(
ctypes.c_short))[
:1].pop()
tmpstr = ctypes.c_char_p(data + nbytes * i + 2)
res.append(tmpstr.value.decode()[0:rbyte])
except ValueError: except ValueError:
res.append(None) res.append(None)
else: else:
for i in range(abs(num_of_rows)): for i in range(abs(num_of_rows)):
try: try:
rbyte=ctypes.cast(data+nbytes*i,ctypes.POINTER(ctypes.c_short))[:1].pop() rbyte = ctypes.cast(
tmpstr = ctypes.c_char_p(data+nbytes*i+2) data + nbytes * i,
res.append( tmpstr.value.decode()[0:rbyte] ) ctypes.POINTER(
ctypes.c_short))[
:1].pop()
tmpstr = ctypes.c_char_p(data + nbytes * i + 2)
res.append(tmpstr.value.decode()[0:rbyte])
except ValueError: except ValueError:
res.append(None) res.append(None)
return res return res
def _crow_nchar_to_python_block(data, num_of_rows, nbytes=None, micro=False): def _crow_nchar_to_python_block(data, num_of_rows, nbytes=None, micro=False):
"""Function to convert C nchar row to python row """Function to convert C nchar row to python row
""" """
assert(nbytes is not None) assert(nbytes is not None)
res=[] res = []
if num_of_rows >= 0: if num_of_rows >= 0:
for i in range(abs(num_of_rows)): for i in range(abs(num_of_rows)):
try: try:
tmpstr = ctypes.c_char_p(data+nbytes*i+2) tmpstr = ctypes.c_char_p(data + nbytes * i + 2)
res.append( tmpstr.value.decode() ) res.append(tmpstr.value.decode())
except ValueError: except ValueError:
res.append(None) res.append(None)
else: else:
for i in range(abs(num_of_rows)): for i in range(abs(num_of_rows)):
try: try:
res.append( (ctypes.cast(data+nbytes*i+2, ctypes.POINTER(ctypes.c_wchar * (nbytes//4))))[0].value ) res.append((ctypes.cast(data + nbytes * i + 2,
ctypes.POINTER(ctypes.c_wchar * (nbytes // 4))))[0].value)
except ValueError: except ValueError:
res.append(None) res.append(None)
return res return res
_CONVERT_FUNC = { _CONVERT_FUNC = {
FieldType.C_BOOL: _crow_bool_to_python, FieldType.C_BOOL: _crow_bool_to_python,
FieldType.C_TINYINT : _crow_tinyint_to_python, FieldType.C_TINYINT: _crow_tinyint_to_python,
FieldType.C_SMALLINT : _crow_smallint_to_python, FieldType.C_SMALLINT: _crow_smallint_to_python,
FieldType.C_INT : _crow_int_to_python, FieldType.C_INT: _crow_int_to_python,
FieldType.C_BIGINT : _crow_bigint_to_python, FieldType.C_BIGINT: _crow_bigint_to_python,
FieldType.C_FLOAT : _crow_float_to_python, FieldType.C_FLOAT: _crow_float_to_python,
FieldType.C_DOUBLE : _crow_double_to_python, FieldType.C_DOUBLE: _crow_double_to_python,
FieldType.C_BINARY: _crow_binary_to_python, FieldType.C_BINARY: _crow_binary_to_python,
FieldType.C_TIMESTAMP : _crow_timestamp_to_python, FieldType.C_TIMESTAMP: _crow_timestamp_to_python,
FieldType.C_NCHAR : _crow_nchar_to_python FieldType.C_NCHAR: _crow_nchar_to_python,
FieldType.C_TINYINT_UNSIGNED: _crow_tinyint_unsigned_to_python,
FieldType.C_SMALLINT_UNSIGNED: _crow_smallint_unsigned_to_python,
FieldType.C_INT_UNSIGNED: _crow_int_unsigned_to_python,
FieldType.C_BIGINT_UNSIGNED: _crow_bigint_unsigned_to_python
} }
_CONVERT_FUNC_BLOCK = { _CONVERT_FUNC_BLOCK = {
FieldType.C_BOOL: _crow_bool_to_python, FieldType.C_BOOL: _crow_bool_to_python,
FieldType.C_TINYINT : _crow_tinyint_to_python, FieldType.C_TINYINT: _crow_tinyint_to_python,
FieldType.C_SMALLINT : _crow_smallint_to_python, FieldType.C_SMALLINT: _crow_smallint_to_python,
FieldType.C_INT : _crow_int_to_python, FieldType.C_INT: _crow_int_to_python,
FieldType.C_BIGINT : _crow_bigint_to_python, FieldType.C_BIGINT: _crow_bigint_to_python,
FieldType.C_FLOAT : _crow_float_to_python, FieldType.C_FLOAT: _crow_float_to_python,
FieldType.C_DOUBLE : _crow_double_to_python, FieldType.C_DOUBLE: _crow_double_to_python,
FieldType.C_BINARY: _crow_binary_to_python_block, FieldType.C_BINARY: _crow_binary_to_python_block,
FieldType.C_TIMESTAMP : _crow_timestamp_to_python, FieldType.C_TIMESTAMP: _crow_timestamp_to_python,
FieldType.C_NCHAR : _crow_nchar_to_python_block FieldType.C_NCHAR: _crow_nchar_to_python_block,
FieldType.C_TINYINT_UNSIGNED: _crow_tinyint_unsigned_to_python,
FieldType.C_SMALLINT_UNSIGNED: _crow_smallint_unsigned_to_python,
FieldType.C_INT_UNSIGNED: _crow_int_unsigned_to_python,
FieldType.C_BIGINT_UNSIGNED: _crow_bigint_unsigned_to_python
} }
# Corresponding TAOS_FIELD structure in C # Corresponding TAOS_FIELD structure in C
class TaosField(ctypes.Structure): class TaosField(ctypes.Structure):
_fields_ = [('name', ctypes.c_char * 65), _fields_ = [('name', ctypes.c_char * 65),
('type', ctypes.c_char), ('type', ctypes.c_char),
('bytes', ctypes.c_short)] ('bytes', ctypes.c_short)]
# C interface class # C interface class
class CTaosInterface(object): class CTaosInterface(object):
libtaos = ctypes.CDLL('libtaos.so') libtaos = ctypes.CDLL('libtaos.so')
...@@ -216,7 +360,7 @@ class CTaosInterface(object): ...@@ -216,7 +360,7 @@ class CTaosInterface(object):
except AttributeError: except AttributeError:
raise AttributeError("config is expected as a str") raise AttributeError("config is expected as a str")
if config != None: if config is not None:
CTaosInterface.libtaos.taos_options(3, self._config) CTaosInterface.libtaos.taos_options(3, self._config)
CTaosInterface.libtaos.taos_init() CTaosInterface.libtaos.taos_init()
...@@ -227,7 +371,13 @@ class CTaosInterface(object): ...@@ -227,7 +371,13 @@ class CTaosInterface(object):
""" """
return self._config return self._config
def connect(self, host=None, user="root", password="taosdata", db=None, port=0): def connect(
self,
host=None,
user="root",
password="taosdata",
db=None,
port=0):
''' '''
Function to connect to server Function to connect to server
...@@ -236,7 +386,7 @@ class CTaosInterface(object): ...@@ -236,7 +386,7 @@ class CTaosInterface(object):
# host # host
try: try:
_host = ctypes.c_char_p(host.encode( _host = ctypes.c_char_p(host.encode(
"utf-8")) if host != None else ctypes.c_char_p(None) "utf-8")) if host is not None else ctypes.c_char_p(None)
except AttributeError: except AttributeError:
raise AttributeError("host is expected as a str") raise AttributeError("host is expected as a str")
...@@ -255,7 +405,7 @@ class CTaosInterface(object): ...@@ -255,7 +405,7 @@ class CTaosInterface(object):
# db # db
try: try:
_db = ctypes.c_char_p( _db = ctypes.c_char_p(
db.encode("utf-8")) if db != None else ctypes.c_char_p(None) db.encode("utf-8")) if db is not None else ctypes.c_char_p(None)
except AttributeError: except AttributeError:
raise AttributeError("db is expected as a str") raise AttributeError("db is expected as a str")
...@@ -268,11 +418,11 @@ class CTaosInterface(object): ...@@ -268,11 +418,11 @@ class CTaosInterface(object):
connection = ctypes.c_void_p(CTaosInterface.libtaos.taos_connect( connection = ctypes.c_void_p(CTaosInterface.libtaos.taos_connect(
_host, _user, _password, _db, _port)) _host, _user, _password, _db, _port))
if connection.value == None: if connection.value is None:
print('connect to TDengine failed') print('connect to TDengine failed')
raise ConnectionError("connect to TDengine failed") raise ConnectionError("connect to TDengine failed")
# sys.exit(1) # sys.exit(1)
#else: # else:
# print('connect to TDengine success') # print('connect to TDengine success')
return connection return connection
...@@ -293,12 +443,13 @@ class CTaosInterface(object): ...@@ -293,12 +443,13 @@ class CTaosInterface(object):
@rtype: 0 on success and -1 on failure @rtype: 0 on success and -1 on failure
''' '''
try: try:
return CTaosInterface.libtaos.taos_query(connection, ctypes.c_char_p(sql.encode('utf-8'))) return CTaosInterface.libtaos.taos_query(
connection, ctypes.c_char_p(sql.encode('utf-8')))
except AttributeError: except AttributeError:
raise AttributeError("sql is expected as a string") raise AttributeError("sql is expected as a string")
# finally: # finally:
# CTaosInterface.libtaos.close(connection) # CTaosInterface.libtaos.close(connection)
@staticmethod @staticmethod
def affectedRows(result): def affectedRows(result):
"""The affected rows after runing query """The affected rows after runing query
...@@ -308,7 +459,7 @@ class CTaosInterface(object): ...@@ -308,7 +459,7 @@ class CTaosInterface(object):
@staticmethod @staticmethod
def subscribe(connection, restart, topic, sql, interval): def subscribe(connection, restart, topic, sql, interval):
"""Create a subscription """Create a subscription
@restart boolean, @restart boolean,
@sql string, sql statement for data query, must be a 'select' statement. @sql string, sql statement for data query, must be a 'select' statement.
@topic string, name of this subscription @topic string, name of this subscription
""" """
...@@ -360,38 +511,53 @@ class CTaosInterface(object): ...@@ -360,38 +511,53 @@ class CTaosInterface(object):
result, ctypes.byref(pblock)) result, ctypes.byref(pblock))
if num_of_rows == 0: if num_of_rows == 0:
return None, 0 return None, 0
isMicro = (CTaosInterface.libtaos.taos_result_precision(result) == FieldType.C_TIMESTAMP_MICRO) isMicro = (CTaosInterface.libtaos.taos_result_precision(
result) == FieldType.C_TIMESTAMP_MICRO)
blocks = [None] * len(fields) blocks = [None] * len(fields)
fieldL = CTaosInterface.libtaos.taos_fetch_lengths(result) fieldL = CTaosInterface.libtaos.taos_fetch_lengths(result)
fieldLen = [ele for ele in ctypes.cast(fieldL, ctypes.POINTER(ctypes.c_int))[:len(fields)]] fieldLen = [
ele for ele in ctypes.cast(
fieldL, ctypes.POINTER(
ctypes.c_int))[
:len(fields)]]
for i in range(len(fields)): for i in range(len(fields)):
data = ctypes.cast(pblock, ctypes.POINTER(ctypes.c_void_p))[i] data = ctypes.cast(pblock, ctypes.POINTER(ctypes.c_void_p))[i]
if fields[i]['type'] not in _CONVERT_FUNC_BLOCK: if fields[i]['type'] not in _CONVERT_FUNC_BLOCK:
raise DatabaseError("Invalid data type returned from database") raise DatabaseError("Invalid data type returned from database")
blocks[i] = _CONVERT_FUNC_BLOCK[fields[i]['type']](data, num_of_rows, fieldLen[i], isMicro) blocks[i] = _CONVERT_FUNC_BLOCK[fields[i]['type']](
data, num_of_rows, fieldLen[i], isMicro)
return blocks, abs(num_of_rows) return blocks, abs(num_of_rows)
@staticmethod @staticmethod
def fetchRow(result, fields): def fetchRow(result, fields):
pblock = ctypes.c_void_p(0) pblock = ctypes.c_void_p(0)
pblock = CTaosInterface.libtaos.taos_fetch_row(result) pblock = CTaosInterface.libtaos.taos_fetch_row(result)
if pblock : if pblock:
num_of_rows = 1 num_of_rows = 1
isMicro = (CTaosInterface.libtaos.taos_result_precision(result) == FieldType.C_TIMESTAMP_MICRO) isMicro = (CTaosInterface.libtaos.taos_result_precision(
result) == FieldType.C_TIMESTAMP_MICRO)
blocks = [None] * len(fields) blocks = [None] * len(fields)
fieldL = CTaosInterface.libtaos.taos_fetch_lengths(result) fieldL = CTaosInterface.libtaos.taos_fetch_lengths(result)
fieldLen = [ele for ele in ctypes.cast(fieldL, ctypes.POINTER(ctypes.c_int))[:len(fields)]] fieldLen = [
ele for ele in ctypes.cast(
fieldL, ctypes.POINTER(
ctypes.c_int))[
:len(fields)]]
for i in range(len(fields)): for i in range(len(fields)):
data = ctypes.cast(pblock, ctypes.POINTER(ctypes.c_void_p))[i] data = ctypes.cast(pblock, ctypes.POINTER(ctypes.c_void_p))[i]
if fields[i]['type'] not in _CONVERT_FUNC: if fields[i]['type'] not in _CONVERT_FUNC:
raise DatabaseError("Invalid data type returned from database") raise DatabaseError(
"Invalid data type returned from database")
if data is None: if data is None:
blocks[i] = [None] blocks[i] = [None]
else: else:
blocks[i] = _CONVERT_FUNC[fields[i]['type']](data, num_of_rows, fieldLen[i], isMicro) blocks[i] = _CONVERT_FUNC[fields[i]['type']](
data, num_of_rows, fieldLen[i], isMicro)
else: else:
return None, 0 return None, 0
return blocks, abs(num_of_rows) return blocks, abs(num_of_rows)
@staticmethod @staticmethod
def freeResult(result): def freeResult(result):
CTaosInterface.libtaos.taos_free_result(result) CTaosInterface.libtaos.taos_free_result(result)
......
...@@ -2,9 +2,11 @@ from .cursor import TDengineCursor ...@@ -2,9 +2,11 @@ from .cursor import TDengineCursor
from .subscription import TDengineSubscription from .subscription import TDengineSubscription
from .cinterface import CTaosInterface from .cinterface import CTaosInterface
class TDengineConnection(object): class TDengineConnection(object):
""" TDengine connection object """ TDengine connection object
""" """
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
self._conn = None self._conn = None
self._host = None self._host = None
...@@ -29,7 +31,7 @@ class TDengineConnection(object): ...@@ -29,7 +31,7 @@ class TDengineConnection(object):
# password # password
if 'password' in kwargs: if 'password' in kwargs:
self._password = kwargs['password'] self._password = kwargs['password']
# database # database
if 'database' in kwargs: if 'database' in kwargs:
self._database = kwargs['database'] self._database = kwargs['database']
...@@ -43,7 +45,12 @@ class TDengineConnection(object): ...@@ -43,7 +45,12 @@ class TDengineConnection(object):
self._config = kwargs['config'] self._config = kwargs['config']
self._chandle = CTaosInterface(self._config) self._chandle = CTaosInterface(self._config)
self._conn = self._chandle.connect(self._host, self._user, self._password, self._database, self._port) self._conn = self._chandle.connect(
self._host,
self._user,
self._password,
self._database,
self._port)
def close(self): def close(self):
"""Close current connection. """Close current connection.
...@@ -55,7 +62,8 @@ class TDengineConnection(object): ...@@ -55,7 +62,8 @@ class TDengineConnection(object):
""" """
if self._conn is None: if self._conn is None:
return None return None
sub = CTaosInterface.subscribe(self._conn, restart, topic, sql, interval) sub = CTaosInterface.subscribe(
self._conn, restart, topic, sql, interval)
return TDengineSubscription(sub) return TDengineSubscription(sub)
def cursor(self): def cursor(self):
...@@ -80,7 +88,8 @@ class TDengineConnection(object): ...@@ -80,7 +88,8 @@ class TDengineConnection(object):
""" """
pass pass
if __name__ == "__main__": if __name__ == "__main__":
conn = TDengineConnection(host='192.168.1.107') conn = TDengineConnection(host='192.168.1.107')
conn.close() conn.close()
print("Hello world") print("Hello world")
\ No newline at end of file
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
from .dbapi import * from .dbapi import *
class FieldType(object): class FieldType(object):
"""TDengine Field Types """TDengine Field Types
""" """
...@@ -18,13 +19,21 @@ class FieldType(object): ...@@ -18,13 +19,21 @@ class FieldType(object):
C_BINARY = 8 C_BINARY = 8
C_TIMESTAMP = 9 C_TIMESTAMP = 9
C_NCHAR = 10 C_NCHAR = 10
C_TINYINT_UNSIGNED = 12
C_SMALLINT_UNSIGNED = 13
C_INT_UNSIGNED = 14
C_BIGINT_UNSIGNED = 15
# NULL value definition # NULL value definition
# NOTE: These values should change according to C definition in tsdb.h # NOTE: These values should change according to C definition in tsdb.h
C_BOOL_NULL = 0x02 C_BOOL_NULL = 0x02
C_TINYINT_NULL = -128 C_TINYINT_NULL = -128
C_TINYINT_UNSIGNED_NULL = 255
C_SMALLINT_NULL = -32768 C_SMALLINT_NULL = -32768
C_SMALLINT_UNSIGNED_NULL = 65535
C_INT_NULL = -2147483648 C_INT_NULL = -2147483648
C_INT_UNSIGNED_NULL = 4294967295
C_BIGINT_NULL = -9223372036854775808 C_BIGINT_NULL = -9223372036854775808
C_BIGINT_UNSIGNED_NULL = 18446744073709551615
C_FLOAT_NULL = float('nan') C_FLOAT_NULL = float('nan')
C_DOUBLE_NULL = float('nan') C_DOUBLE_NULL = float('nan')
C_BINARY_NULL = bytearray([int('0xff', 16)]) C_BINARY_NULL = bytearray([int('0xff', 16)])
......
...@@ -128,8 +128,8 @@ class TDengineCursor(object): ...@@ -128,8 +128,8 @@ class TDengineCursor(object):
if errno == 0: if errno == 0:
if CTaosInterface.fieldsCount(self._result) == 0: if CTaosInterface.fieldsCount(self._result) == 0:
self._affected_rows += CTaosInterface.affectedRows( self._affected_rows += CTaosInterface.affectedRows(
self._result ) self._result)
return CTaosInterface.affectedRows(self._result ) return CTaosInterface.affectedRows(self._result)
else: else:
self._fields = CTaosInterface.useResult( self._fields = CTaosInterface.useResult(
self._result) self._result)
...@@ -148,6 +148,7 @@ class TDengineCursor(object): ...@@ -148,6 +148,7 @@ class TDengineCursor(object):
"""Fetch the next row of a query result set, returning a single sequence, or None when no more data is available. """Fetch the next row of a query result set, returning a single sequence, or None when no more data is available.
""" """
pass pass
def fetchmany(self): def fetchmany(self):
pass pass
...@@ -158,11 +159,26 @@ class TDengineCursor(object): ...@@ -158,11 +159,26 @@ class TDengineCursor(object):
if (dataType.upper() == "TINYINT"): if (dataType.upper() == "TINYINT"):
if (self._description[col][1] == FieldType.C_TINYINT): if (self._description[col][1] == FieldType.C_TINYINT):
return True return True
if (dataType.upper() == "TINYINT UNSIGNED"):
if (self._description[col][1] == FieldType.C_TINYINT_UNSIGNED):
return True
if (dataType.upper() == "SMALLINT"):
if (self._description[col][1] == FieldType.C_SMALLINT):
return True
if (dataType.upper() == "SMALLINT UNSIGNED"):
if (self._description[col][1] == FieldType.C_SMALLINT_UNSIGNED):
return True
if (dataType.upper() == "INT"): if (dataType.upper() == "INT"):
if (self._description[col][1] == FieldType.C_INT): if (self._description[col][1] == FieldType.C_INT):
return True return True
if (dataType.upper() == "INT UNSIGNED"):
if (self._description[col][1] == FieldType.C_INT_UNSIGNED):
return True
if (dataType.upper() == "BIGINT"): if (dataType.upper() == "BIGINT"):
if (self._description[col][1] == FieldType.C_INT): if (self._description[col][1] == FieldType.C_BIGINT):
return True
if (dataType.upper() == "BIGINT UNSIGNED"):
if (self._description[col][1] == FieldType.C_BIGINT_UNSIGNED):
return True return True
if (dataType.upper() == "FLOAT"): if (dataType.upper() == "FLOAT"):
if (self._description[col][1] == FieldType.C_FLOAT): if (self._description[col][1] == FieldType.C_FLOAT):
...@@ -191,16 +207,20 @@ class TDengineCursor(object): ...@@ -191,16 +207,20 @@ class TDengineCursor(object):
buffer = [[] for i in range(len(self._fields))] buffer = [[] for i in range(len(self._fields))]
self._rowcount = 0 self._rowcount = 0
while True: while True:
block, num_of_fields = CTaosInterface.fetchRow(self._result, self._fields) block, num_of_fields = CTaosInterface.fetchRow(
self._result, self._fields)
errno = CTaosInterface.libtaos.taos_errno(self._result) errno = CTaosInterface.libtaos.taos_errno(self._result)
if errno != 0: if errno != 0:
raise ProgrammingError(CTaosInterface.errStr(self._result), errno) raise ProgrammingError(
CTaosInterface.errStr(
self._result), errno)
if num_of_fields == 0: if num_of_fields == 0:
break break
self._rowcount += num_of_fields self._rowcount += num_of_fields
for i in range(len(self._fields)): for i in range(len(self._fields)):
buffer[i].extend(block[i]) buffer[i].extend(block[i])
return list(map(tuple, zip(*buffer))) return list(map(tuple, zip(*buffer)))
def fetchall(self): def fetchall(self):
if self._result is None or self._fields is None: if self._result is None or self._fields is None:
raise OperationalError("Invalid use of fetchall") raise OperationalError("Invalid use of fetchall")
...@@ -208,16 +228,20 @@ class TDengineCursor(object): ...@@ -208,16 +228,20 @@ class TDengineCursor(object):
buffer = [[] for i in range(len(self._fields))] buffer = [[] for i in range(len(self._fields))]
self._rowcount = 0 self._rowcount = 0
while True: while True:
block, num_of_fields = CTaosInterface.fetchBlock(self._result, self._fields) block, num_of_fields = CTaosInterface.fetchBlock(
self._result, self._fields)
errno = CTaosInterface.libtaos.taos_errno(self._result) errno = CTaosInterface.libtaos.taos_errno(self._result)
if errno != 0: if errno != 0:
raise ProgrammingError(CTaosInterface.errStr(self._result), errno) raise ProgrammingError(
CTaosInterface.errStr(
self._result), errno)
if num_of_fields == 0: if num_of_fields == 0:
break break
self._rowcount += num_of_fields self._rowcount += num_of_fields
for i in range(len(self._fields)): for i in range(len(self._fields)):
buffer[i].extend(block[i]) buffer[i].extend(block[i])
return list(map(tuple, zip(*buffer))) return list(map(tuple, zip(*buffer)))
def nextset(self): def nextset(self):
""" """
""" """
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
import time import time
import datetime import datetime
class DBAPITypeObject(object): class DBAPITypeObject(object):
def __init__(self, *values): def __init__(self, *values):
self.values = values self.values = values
...@@ -16,23 +17,28 @@ class DBAPITypeObject(object): ...@@ -16,23 +17,28 @@ class DBAPITypeObject(object):
else: else:
return -1 return -1
Date = datetime.date Date = datetime.date
Time = datetime.time Time = datetime.time
Timestamp = datetime.datetime Timestamp = datetime.datetime
def DataFromTicks(ticks): def DataFromTicks(ticks):
return Date(*time.localtime(ticks)[:3]) return Date(*time.localtime(ticks)[:3])
def TimeFromTicks(ticks): def TimeFromTicks(ticks):
return Time(*time.localtime(ticks)[3:6]) return Time(*time.localtime(ticks)[3:6])
def TimestampFromTicks(ticks): def TimestampFromTicks(ticks):
return Timestamp(*time.localtime(ticks)[:6]) return Timestamp(*time.localtime(ticks)[:6])
Binary = bytes Binary = bytes
# STRING = DBAPITypeObject(*constants.FieldType.get_string_types()) # STRING = DBAPITypeObject(*constants.FieldType.get_string_types())
# BINARY = DBAPITypeObject(*constants.FieldType.get_binary_types()) # BINARY = DBAPITypeObject(*constants.FieldType.get_binary_types())
# NUMBER = BAPITypeObject(*constants.FieldType.get_number_types()) # NUMBER = BAPITypeObject(*constants.FieldType.get_number_types())
# DATETIME = DBAPITypeObject(*constants.FieldType.get_timestamp_types()) # DATETIME = DBAPITypeObject(*constants.FieldType.get_timestamp_types())
# ROWID = DBAPITypeObject() # ROWID = DBAPITypeObject()
\ No newline at end of file
"""Python exceptions """Python exceptions
""" """
class Error(Exception): class Error(Exception):
def __init__(self, msg=None, errno=None): def __init__(self, msg=None, errno=None):
self.msg = msg self.msg = msg
self._full_msg = self.msg self._full_msg = self.msg
self.errno = errno self.errno = errno
def __str__(self): def __str__(self):
return self._full_msg return self._full_msg
class Warning(Exception): class Warning(Exception):
"""Exception raised for important warnings like data truncations while inserting. """Exception raised for important warnings like data truncations while inserting.
""" """
pass pass
class InterfaceError(Error): class InterfaceError(Error):
"""Exception raised for errors that are related to the database interface rather than the database itself. """Exception raised for errors that are related to the database interface rather than the database itself.
""" """
pass pass
class DatabaseError(Error): class DatabaseError(Error):
"""Exception raised for errors that are related to the database. """Exception raised for errors that are related to the database.
""" """
pass pass
class DataError(DatabaseError): class DataError(DatabaseError):
"""Exception raised for errors that are due to problems with the processed data like division by zero, numeric value out of range. """Exception raised for errors that are due to problems with the processed data like division by zero, numeric value out of range.
""" """
pass pass
class OperationalError(DatabaseError): class OperationalError(DatabaseError):
"""Exception raised for errors that are related to the database's operation and not necessarily under the control of the programmer """Exception raised for errors that are related to the database's operation and not necessarily under the control of the programmer
""" """
...@@ -41,17 +47,20 @@ class IntegrityError(DatabaseError): ...@@ -41,17 +47,20 @@ class IntegrityError(DatabaseError):
""" """
pass pass
class InternalError(DatabaseError): class InternalError(DatabaseError):
"""Exception raised when the database encounters an internal error. """Exception raised when the database encounters an internal error.
""" """
pass pass
class ProgrammingError(DatabaseError): class ProgrammingError(DatabaseError):
"""Exception raised for programming errors. """Exception raised for programming errors.
""" """
pass pass
class NotSupportedError(DatabaseError): class NotSupportedError(DatabaseError):
"""Exception raised in case a method or database API was used which is not supported by the database,. """Exception raised in case a method or database API was used which is not supported by the database,.
""" """
pass pass
\ No newline at end of file
from .cinterface import CTaosInterface from .cinterface import CTaosInterface
from .error import * from .error import *
class TDengineSubscription(object): class TDengineSubscription(object):
"""TDengine subscription object """TDengine subscription object
""" """
def __init__(self, sub): def __init__(self, sub):
self._sub = sub self._sub = sub
def consume(self): def consume(self):
"""Consume rows of a subscription """Consume rows of a subscription
""" """
if self._sub is None: if self._sub is None:
raise OperationalError("Invalid use of consume") raise OperationalError("Invalid use of consume")
result, fields = CTaosInterface.consume(self._sub) result, fields = CTaosInterface.consume(self._sub)
buffer = [[] for i in range(len(fields))] buffer = [[] for i in range(len(fields))]
while True: while True:
block, num_of_fields = CTaosInterface.fetchBlock(result, fields) block, num_of_fields = CTaosInterface.fetchBlock(result, fields)
if num_of_fields == 0: break if num_of_fields == 0:
break
for i in range(len(fields)): for i in range(len(fields)):
buffer[i].extend(block[i]) buffer[i].extend(block[i])
self.fields = fields self.fields = fields
return list(map(tuple, zip(*buffer))) return list(map(tuple, zip(*buffer)))
def close(self, keepProgress=True):
def close(self, keepProgress = True):
"""Close the Subscription. """Close the Subscription.
""" """
if self._sub is None: if self._sub is None:
return False return False
CTaosInterface.unsubscribe(self._sub, keepProgress) CTaosInterface.unsubscribe(self._sub, keepProgress)
return True return True
if __name__ == '__main__': if __name__ == '__main__':
from .connection import TDengineConnection from .connection import TDengineConnection
conn = TDengineConnection(host="127.0.0.1", user="root", password="taosdata", database="test") conn = TDengineConnection(
host="127.0.0.1",
user="root",
password="taosdata",
database="test")
# Generate a cursor object to run SQL commands # Generate a cursor object to run SQL commands
sub = conn.subscribe(True, "test", "select * from meters;", 1000) sub = conn.subscribe(True, "test", "select * from meters;", 1000)
for i in range(0,10): for i in range(0, 10):
data = sub.consume() data = sub.consume()
for d in data: for d in data:
print(d) print(d)
sub.close() sub.close()
conn.close() conn.close()
\ No newline at end of file
...@@ -5,7 +5,7 @@ with open("README.md", "r") as fh: ...@@ -5,7 +5,7 @@ with open("README.md", "r") as fh:
setuptools.setup( setuptools.setup(
name="taos", name="taos",
version="2.0.4", version="2.0.5",
author="Taosdata Inc.", author="Taosdata Inc.",
author_email="support@taosdata.com", author_email="support@taosdata.com",
description="TDengine python client package", description="TDengine python client package",
......
...@@ -3,12 +3,12 @@ from .connection import TDengineConnection ...@@ -3,12 +3,12 @@ from .connection import TDengineConnection
from .cursor import TDengineCursor from .cursor import TDengineCursor
# Globals # Globals
apilevel = '2.0.3'
threadsafety = 0 threadsafety = 0
paramstyle = 'pyformat' paramstyle = 'pyformat'
__all__ = ['connection', 'cursor'] __all__ = ['connection', 'cursor']
def connect(*args, **kwargs): def connect(*args, **kwargs):
""" Function to return a TDengine connector object """ Function to return a TDengine connector object
......
...@@ -4,11 +4,14 @@ from .error import * ...@@ -4,11 +4,14 @@ from .error import *
import math import math
import datetime import datetime
def _convert_millisecond_to_datetime(milli): def _convert_millisecond_to_datetime(milli):
return datetime.datetime.fromtimestamp(milli/1000.0) return datetime.datetime.fromtimestamp(milli / 1000.0)
def _convert_microsecond_to_datetime(micro): def _convert_microsecond_to_datetime(micro):
return datetime.datetime.fromtimestamp(micro/1000000.0) return datetime.datetime.fromtimestamp(micro / 1000000.0)
def _crow_timestamp_to_python(data, num_of_rows, nbytes=None, micro=False): def _crow_timestamp_to_python(data, num_of_rows, nbytes=None, micro=False):
"""Function to convert C bool row to python row """Function to convert C bool row to python row
...@@ -18,168 +21,309 @@ def _crow_timestamp_to_python(data, num_of_rows, nbytes=None, micro=False): ...@@ -18,168 +21,309 @@ def _crow_timestamp_to_python(data, num_of_rows, nbytes=None, micro=False):
_timestamp_converter = _convert_microsecond_to_datetime _timestamp_converter = _convert_microsecond_to_datetime
if num_of_rows > 0: if num_of_rows > 0:
return list(map(_timestamp_converter, ctypes.cast(data, ctypes.POINTER(ctypes.c_long))[:abs(num_of_rows)])) return list(map(_timestamp_converter, ctypes.cast(
data, ctypes.POINTER(ctypes.c_long))[:abs(num_of_rows)]))
else: else:
return list(map(_timestamp_converter, ctypes.cast(data, ctypes.POINTER(ctypes.c_long))[:abs(num_of_rows)])) return list(map(_timestamp_converter, ctypes.cast(
data, ctypes.POINTER(ctypes.c_long))[:abs(num_of_rows)]))
def _crow_bool_to_python(data, num_of_rows, nbytes=None, micro=False): def _crow_bool_to_python(data, num_of_rows, nbytes=None, micro=False):
"""Function to convert C bool row to python row """Function to convert C bool row to python row
""" """
if num_of_rows > 0: if num_of_rows > 0:
return [ None if ele == FieldType.C_BOOL_NULL else bool(ele) for ele in ctypes.cast(data, ctypes.POINTER(ctypes.c_byte))[:abs(num_of_rows)] ] return [
None if ele == FieldType.C_BOOL_NULL else bool(ele) for ele in ctypes.cast(
data, ctypes.POINTER(
ctypes.c_byte))[
:abs(num_of_rows)]]
else: else:
return [ None if ele == FieldType.C_BOOL_NULL else bool(ele) for ele in ctypes.cast(data, ctypes.POINTER(ctypes.c_bool))[:abs(num_of_rows)] ] return [
None if ele == FieldType.C_BOOL_NULL else bool(ele) for ele in ctypes.cast(
data, ctypes.POINTER(
ctypes.c_bool))[
:abs(num_of_rows)]]
def _crow_tinyint_to_python(data, num_of_rows, nbytes=None, micro=False): def _crow_tinyint_to_python(data, num_of_rows, nbytes=None, micro=False):
"""Function to convert C tinyint row to python row """Function to convert C tinyint row to python row
""" """
if num_of_rows > 0: if num_of_rows > 0:
return [ None if ele == FieldType.C_TINYINT_NULL else ele for ele in ctypes.cast(data, ctypes.POINTER(ctypes.c_byte))[:abs(num_of_rows)] ] return [None if ele == FieldType.C_TINYINT_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(ctypes.c_byte))[:abs(num_of_rows)]]
else:
return [None if ele == FieldType.C_TINYINT_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(ctypes.c_byte))[:abs(num_of_rows)]]
def _crow_tinyint_unsigned_to_python(
data,
num_of_rows,
nbytes=None,
micro=False):
"""Function to convert C tinyint row to python row
"""
if num_of_rows > 0:
return [
None if ele == FieldType.C_TINYINT_UNSIGNED_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(
ctypes.c_byte))[
:abs(num_of_rows)]]
else: else:
return [ None if ele == FieldType.C_TINYINT_NULL else ele for ele in ctypes.cast(data, ctypes.POINTER(ctypes.c_byte))[:abs(num_of_rows)] ] return [
None if ele == FieldType.C_TINYINT_UNSIGNED_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(
ctypes.c_byte))[
:abs(num_of_rows)]]
def _crow_smallint_to_python(data, num_of_rows, nbytes=None, micro=False): def _crow_smallint_to_python(data, num_of_rows, nbytes=None, micro=False):
"""Function to convert C smallint row to python row """Function to convert C smallint row to python row
""" """
if num_of_rows > 0: if num_of_rows > 0:
return [ None if ele == FieldType.C_SMALLINT_NULL else ele for ele in ctypes.cast(data, ctypes.POINTER(ctypes.c_short))[:abs(num_of_rows)]] return [
None if ele == FieldType.C_SMALLINT_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(
ctypes.c_short))[
:abs(num_of_rows)]]
else: else:
return [ None if ele == FieldType.C_SMALLINT_NULL else ele for ele in ctypes.cast(data, ctypes.POINTER(ctypes.c_short))[:abs(num_of_rows)] ] return [
None if ele == FieldType.C_SMALLINT_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(
ctypes.c_short))[
:abs(num_of_rows)]]
def _crow_smallint_unsigned_to_python(
data, num_of_rows, nbytes=None, micro=False):
"""Function to convert C smallint row to python row
"""
if num_of_rows > 0:
return [
None if ele == FieldType.C_SMALLINT_UNSIGNED_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(
ctypes.c_short))[
:abs(num_of_rows)]]
else:
return [
None if ele == FieldType.C_SMALLINT_UNSIGNED_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(
ctypes.c_short))[
:abs(num_of_rows)]]
def _crow_int_to_python(data, num_of_rows, nbytes=None, micro=False): def _crow_int_to_python(data, num_of_rows, nbytes=None, micro=False):
"""Function to convert C int row to python row """Function to convert C int row to python row
""" """
if num_of_rows > 0: if num_of_rows > 0:
return [ None if ele == FieldType.C_INT_NULL else ele for ele in ctypes.cast(data, ctypes.POINTER(ctypes.c_int))[:abs(num_of_rows)] ] return [None if ele == FieldType.C_INT_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(ctypes.c_int))[:abs(num_of_rows)]]
else:
return [None if ele == FieldType.C_INT_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(ctypes.c_int))[:abs(num_of_rows)]]
def _crow_int_unsigned_to_python(data, num_of_rows, nbytes=None, micro=False):
"""Function to convert C int row to python row
"""
if num_of_rows > 0:
return [
None if ele == FieldType.C_INT_UNSIGNED_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(
ctypes.c_int))[
:abs(num_of_rows)]]
else: else:
return [ None if ele == FieldType.C_INT_NULL else ele for ele in ctypes.cast(data, ctypes.POINTER(ctypes.c_int))[:abs(num_of_rows)] ] return [
None if ele == FieldType.C_INT_UNSIGNED_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(
ctypes.c_int))[
:abs(num_of_rows)]]
def _crow_bigint_to_python(data, num_of_rows, nbytes=None, micro=False): def _crow_bigint_to_python(data, num_of_rows, nbytes=None, micro=False):
"""Function to convert C bigint row to python row """Function to convert C bigint row to python row
""" """
if num_of_rows > 0: if num_of_rows > 0:
return [ None if ele == FieldType.C_BIGINT_NULL else ele for ele in ctypes.cast(data, ctypes.POINTER(ctypes.c_long))[:abs(num_of_rows)] ] return [None if ele == FieldType.C_BIGINT_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(ctypes.c_long))[:abs(num_of_rows)]]
else:
return [None if ele == FieldType.C_BIGINT_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(ctypes.c_long))[:abs(num_of_rows)]]
def _crow_bigint_unsigned_to_python(
data,
num_of_rows,
nbytes=None,
micro=False):
"""Function to convert C bigint row to python row
"""
if num_of_rows > 0:
return [
None if ele == FieldType.C_BIGINT_UNSIGNED_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(
ctypes.c_long))[
:abs(num_of_rows)]]
else: else:
return [ None if ele == FieldType.C_BIGINT_NULL else ele for ele in ctypes.cast(data, ctypes.POINTER(ctypes.c_long))[:abs(num_of_rows)] ] return [
None if ele == FieldType.C_BIGINT_UNSIGNED_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(
ctypes.c_long))[
:abs(num_of_rows)]]
def _crow_float_to_python(data, num_of_rows, nbytes=None, micro=False): def _crow_float_to_python(data, num_of_rows, nbytes=None, micro=False):
"""Function to convert C float row to python row """Function to convert C float row to python row
""" """
if num_of_rows > 0: if num_of_rows > 0:
return [ None if math.isnan(ele) else ele for ele in ctypes.cast(data, ctypes.POINTER(ctypes.c_float))[:abs(num_of_rows)] ] return [None if math.isnan(ele) else ele for ele in ctypes.cast(
data, ctypes.POINTER(ctypes.c_float))[:abs(num_of_rows)]]
else: else:
return [ None if math.isnan(ele) else ele for ele in ctypes.cast(data, ctypes.POINTER(ctypes.c_float))[:abs(num_of_rows)] ] return [None if math.isnan(ele) else ele for ele in ctypes.cast(
data, ctypes.POINTER(ctypes.c_float))[:abs(num_of_rows)]]
def _crow_double_to_python(data, num_of_rows, nbytes=None, micro=False): def _crow_double_to_python(data, num_of_rows, nbytes=None, micro=False):
"""Function to convert C double row to python row """Function to convert C double row to python row
""" """
if num_of_rows > 0: if num_of_rows > 0:
return [ None if math.isnan(ele) else ele for ele in ctypes.cast(data, ctypes.POINTER(ctypes.c_double))[:abs(num_of_rows)] ] return [None if math.isnan(ele) else ele for ele in ctypes.cast(
data, ctypes.POINTER(ctypes.c_double))[:abs(num_of_rows)]]
else: else:
return [ None if math.isnan(ele) else ele for ele in ctypes.cast(data, ctypes.POINTER(ctypes.c_double))[:abs(num_of_rows)] ] return [None if math.isnan(ele) else ele for ele in ctypes.cast(
data, ctypes.POINTER(ctypes.c_double))[:abs(num_of_rows)]]
def _crow_binary_to_python(data, num_of_rows, nbytes=None, micro=False): def _crow_binary_to_python(data, num_of_rows, nbytes=None, micro=False):
"""Function to convert C binary row to python row """Function to convert C binary row to python row
""" """
assert(nbytes is not None) assert(nbytes is not None)
if num_of_rows > 0: if num_of_rows > 0:
return [ None if ele.value[0:1] == FieldType.C_BINARY_NULL else ele.value.decode('utf-8') for ele in (ctypes.cast(data, ctypes.POINTER(ctypes.c_char * nbytes)))[:abs(num_of_rows)]] return [None if ele.value[0:1] == FieldType.C_BINARY_NULL else ele.value.decode(
'utf-8') for ele in (ctypes.cast(data, ctypes.POINTER(ctypes.c_char * nbytes)))[:abs(num_of_rows)]]
else: else:
return [ None if ele.value[0:1] == FieldType.C_BINARY_NULL else ele.value.decode('utf-8') for ele in (ctypes.cast(data, ctypes.POINTER(ctypes.c_char * nbytes)))[:abs(num_of_rows)]] return [None if ele.value[0:1] == FieldType.C_BINARY_NULL else ele.value.decode(
'utf-8') for ele in (ctypes.cast(data, ctypes.POINTER(ctypes.c_char * nbytes)))[:abs(num_of_rows)]]
def _crow_nchar_to_python(data, num_of_rows, nbytes=None, micro=False): def _crow_nchar_to_python(data, num_of_rows, nbytes=None, micro=False):
"""Function to convert C nchar row to python row """Function to convert C nchar row to python row
""" """
assert(nbytes is not None) assert(nbytes is not None)
res=[] res = []
for i in range(abs(num_of_rows)): for i in range(abs(num_of_rows)):
try: try:
if num_of_rows >= 0: if num_of_rows >= 0:
tmpstr = ctypes.c_char_p(data) tmpstr = ctypes.c_char_p(data)
res.append( tmpstr.value.decode() ) res.append(tmpstr.value.decode())
else: else:
res.append( (ctypes.cast(data+nbytes*i, ctypes.POINTER(ctypes.c_wchar * (nbytes//4))))[0].value ) res.append((ctypes.cast(data + nbytes * i,
ctypes.POINTER(ctypes.c_wchar * (nbytes // 4))))[0].value)
except ValueError: except ValueError:
res.append(None) res.append(None)
return res return res
def _crow_binary_to_python_block(data, num_of_rows, nbytes=None, micro=False): def _crow_binary_to_python_block(data, num_of_rows, nbytes=None, micro=False):
"""Function to convert C binary row to python row """Function to convert C binary row to python row
""" """
assert(nbytes is not None) assert(nbytes is not None)
res=[] res = []
if num_of_rows > 0: if num_of_rows > 0:
for i in range(abs(num_of_rows)): for i in range(abs(num_of_rows)):
try: try:
rbyte=ctypes.cast(data+nbytes*i,ctypes.POINTER(ctypes.c_short))[:1].pop() rbyte = ctypes.cast(
tmpstr = ctypes.c_char_p(data+nbytes*i+2) data + nbytes * i,
res.append( tmpstr.value.decode()[0:rbyte] ) ctypes.POINTER(
ctypes.c_short))[
:1].pop()
tmpstr = ctypes.c_char_p(data + nbytes * i + 2)
res.append(tmpstr.value.decode()[0:rbyte])
except ValueError: except ValueError:
res.append(None) res.append(None)
else: else:
for i in range(abs(num_of_rows)): for i in range(abs(num_of_rows)):
try: try:
rbyte=ctypes.cast(data+nbytes*i,ctypes.POINTER(ctypes.c_short))[:1].pop() rbyte = ctypes.cast(
tmpstr = ctypes.c_char_p(data+nbytes*i+2) data + nbytes * i,
res.append( tmpstr.value.decode()[0:rbyte] ) ctypes.POINTER(
ctypes.c_short))[
:1].pop()
tmpstr = ctypes.c_char_p(data + nbytes * i + 2)
res.append(tmpstr.value.decode()[0:rbyte])
except ValueError: except ValueError:
res.append(None) res.append(None)
return res return res
def _crow_nchar_to_python_block(data, num_of_rows, nbytes=None, micro=False): def _crow_nchar_to_python_block(data, num_of_rows, nbytes=None, micro=False):
"""Function to convert C nchar row to python row """Function to convert C nchar row to python row
""" """
assert(nbytes is not None) assert(nbytes is not None)
res=[] res = []
if num_of_rows >= 0: if num_of_rows >= 0:
for i in range(abs(num_of_rows)): for i in range(abs(num_of_rows)):
try: try:
tmpstr = ctypes.c_char_p(data+nbytes*i+2) tmpstr = ctypes.c_char_p(data + nbytes * i + 2)
res.append( tmpstr.value.decode() ) res.append(tmpstr.value.decode())
except ValueError: except ValueError:
res.append(None) res.append(None)
else: else:
for i in range(abs(num_of_rows)): for i in range(abs(num_of_rows)):
try: try:
res.append( (ctypes.cast(data+nbytes*i+2, ctypes.POINTER(ctypes.c_wchar * (nbytes//4))))[0].value ) res.append((ctypes.cast(data + nbytes * i + 2,
ctypes.POINTER(ctypes.c_wchar * (nbytes // 4))))[0].value)
except ValueError: except ValueError:
res.append(None) res.append(None)
return res return res
_CONVERT_FUNC = { _CONVERT_FUNC = {
FieldType.C_BOOL: _crow_bool_to_python, FieldType.C_BOOL: _crow_bool_to_python,
FieldType.C_TINYINT : _crow_tinyint_to_python, FieldType.C_TINYINT: _crow_tinyint_to_python,
FieldType.C_SMALLINT : _crow_smallint_to_python, FieldType.C_SMALLINT: _crow_smallint_to_python,
FieldType.C_INT : _crow_int_to_python, FieldType.C_INT: _crow_int_to_python,
FieldType.C_BIGINT : _crow_bigint_to_python, FieldType.C_BIGINT: _crow_bigint_to_python,
FieldType.C_FLOAT : _crow_float_to_python, FieldType.C_FLOAT: _crow_float_to_python,
FieldType.C_DOUBLE : _crow_double_to_python, FieldType.C_DOUBLE: _crow_double_to_python,
FieldType.C_BINARY: _crow_binary_to_python, FieldType.C_BINARY: _crow_binary_to_python,
FieldType.C_TIMESTAMP : _crow_timestamp_to_python, FieldType.C_TIMESTAMP: _crow_timestamp_to_python,
FieldType.C_NCHAR : _crow_nchar_to_python FieldType.C_NCHAR: _crow_nchar_to_python,
FieldType.C_TINYINT_UNSIGNED: _crow_tinyint_unsigned_to_python,
FieldType.C_SMALLINT_UNSIGNED: _crow_smallint_unsigned_to_python,
FieldType.C_INT_UNSIGNED: _crow_int_unsigned_to_python,
FieldType.C_BIGINT_UNSIGNED: _crow_bigint_unsigned_to_python
} }
_CONVERT_FUNC_BLOCK = { _CONVERT_FUNC_BLOCK = {
FieldType.C_BOOL: _crow_bool_to_python, FieldType.C_BOOL: _crow_bool_to_python,
FieldType.C_TINYINT : _crow_tinyint_to_python, FieldType.C_TINYINT: _crow_tinyint_to_python,
FieldType.C_SMALLINT : _crow_smallint_to_python, FieldType.C_SMALLINT: _crow_smallint_to_python,
FieldType.C_INT : _crow_int_to_python, FieldType.C_INT: _crow_int_to_python,
FieldType.C_BIGINT : _crow_bigint_to_python, FieldType.C_BIGINT: _crow_bigint_to_python,
FieldType.C_FLOAT : _crow_float_to_python, FieldType.C_FLOAT: _crow_float_to_python,
FieldType.C_DOUBLE : _crow_double_to_python, FieldType.C_DOUBLE: _crow_double_to_python,
FieldType.C_BINARY: _crow_binary_to_python_block, FieldType.C_BINARY: _crow_binary_to_python_block,
FieldType.C_TIMESTAMP : _crow_timestamp_to_python, FieldType.C_TIMESTAMP: _crow_timestamp_to_python,
FieldType.C_NCHAR : _crow_nchar_to_python_block FieldType.C_NCHAR: _crow_nchar_to_python_block,
FieldType.C_TINYINT_UNSIGNED: _crow_tinyint_unsigned_to_python,
FieldType.C_SMALLINT_UNSIGNED: _crow_smallint_unsigned_to_python,
FieldType.C_INT_UNSIGNED: _crow_int_unsigned_to_python,
FieldType.C_BIGINT_UNSIGNED: _crow_bigint_unsigned_to_python
} }
# Corresponding TAOS_FIELD structure in C # Corresponding TAOS_FIELD structure in C
class TaosField(ctypes.Structure): class TaosField(ctypes.Structure):
_fields_ = [('name', ctypes.c_char * 65), _fields_ = [('name', ctypes.c_char * 65),
('type', ctypes.c_char), ('type', ctypes.c_char),
('bytes', ctypes.c_short)] ('bytes', ctypes.c_short)]
# C interface class # C interface class
class CTaosInterface(object): class CTaosInterface(object):
libtaos = ctypes.CDLL('libtaos.so') libtaos = ctypes.CDLL('libtaos.so')
...@@ -216,7 +360,7 @@ class CTaosInterface(object): ...@@ -216,7 +360,7 @@ class CTaosInterface(object):
except AttributeError: except AttributeError:
raise AttributeError("config is expected as a str") raise AttributeError("config is expected as a str")
if config != None: if config is not None:
CTaosInterface.libtaos.taos_options(3, self._config) CTaosInterface.libtaos.taos_options(3, self._config)
CTaosInterface.libtaos.taos_init() CTaosInterface.libtaos.taos_init()
...@@ -227,7 +371,13 @@ class CTaosInterface(object): ...@@ -227,7 +371,13 @@ class CTaosInterface(object):
""" """
return self._config return self._config
def connect(self, host=None, user="root", password="taosdata", db=None, port=0): def connect(
self,
host=None,
user="root",
password="taosdata",
db=None,
port=0):
''' '''
Function to connect to server Function to connect to server
...@@ -236,7 +386,7 @@ class CTaosInterface(object): ...@@ -236,7 +386,7 @@ class CTaosInterface(object):
# host # host
try: try:
_host = ctypes.c_char_p(host.encode( _host = ctypes.c_char_p(host.encode(
"utf-8")) if host != None else ctypes.c_char_p(None) "utf-8")) if host is not None else ctypes.c_char_p(None)
except AttributeError: except AttributeError:
raise AttributeError("host is expected as a str") raise AttributeError("host is expected as a str")
...@@ -255,7 +405,7 @@ class CTaosInterface(object): ...@@ -255,7 +405,7 @@ class CTaosInterface(object):
# db # db
try: try:
_db = ctypes.c_char_p( _db = ctypes.c_char_p(
db.encode("utf-8")) if db != None else ctypes.c_char_p(None) db.encode("utf-8")) if db is not None else ctypes.c_char_p(None)
except AttributeError: except AttributeError:
raise AttributeError("db is expected as a str") raise AttributeError("db is expected as a str")
...@@ -268,11 +418,11 @@ class CTaosInterface(object): ...@@ -268,11 +418,11 @@ class CTaosInterface(object):
connection = ctypes.c_void_p(CTaosInterface.libtaos.taos_connect( connection = ctypes.c_void_p(CTaosInterface.libtaos.taos_connect(
_host, _user, _password, _db, _port)) _host, _user, _password, _db, _port))
if connection.value == None: if connection.value is None:
print('connect to TDengine failed') print('connect to TDengine failed')
raise ConnectionError("connect to TDengine failed") raise ConnectionError("connect to TDengine failed")
# sys.exit(1) # sys.exit(1)
#else: # else:
# print('connect to TDengine success') # print('connect to TDengine success')
return connection return connection
...@@ -293,7 +443,8 @@ class CTaosInterface(object): ...@@ -293,7 +443,8 @@ class CTaosInterface(object):
@rtype: 0 on success and -1 on failure @rtype: 0 on success and -1 on failure
''' '''
try: try:
return CTaosInterface.libtaos.taos_query(connection, ctypes.c_char_p(sql.encode('utf-8'))) return CTaosInterface.libtaos.taos_query(
connection, ctypes.c_char_p(sql.encode('utf-8')))
except AttributeError: except AttributeError:
raise AttributeError("sql is expected as a string") raise AttributeError("sql is expected as a string")
# finally: # finally:
...@@ -308,7 +459,7 @@ class CTaosInterface(object): ...@@ -308,7 +459,7 @@ class CTaosInterface(object):
@staticmethod @staticmethod
def subscribe(connection, restart, topic, sql, interval): def subscribe(connection, restart, topic, sql, interval):
"""Create a subscription """Create a subscription
@restart boolean, @restart boolean,
@sql string, sql statement for data query, must be a 'select' statement. @sql string, sql statement for data query, must be a 'select' statement.
@topic string, name of this subscription @topic string, name of this subscription
""" """
...@@ -360,35 +511,49 @@ class CTaosInterface(object): ...@@ -360,35 +511,49 @@ class CTaosInterface(object):
result, ctypes.byref(pblock)) result, ctypes.byref(pblock))
if num_of_rows == 0: if num_of_rows == 0:
return None, 0 return None, 0
isMicro = (CTaosInterface.libtaos.taos_result_precision(result) == FieldType.C_TIMESTAMP_MICRO) isMicro = (CTaosInterface.libtaos.taos_result_precision(
result) == FieldType.C_TIMESTAMP_MICRO)
blocks = [None] * len(fields) blocks = [None] * len(fields)
fieldL = CTaosInterface.libtaos.taos_fetch_lengths(result) fieldL = CTaosInterface.libtaos.taos_fetch_lengths(result)
fieldLen = [ele for ele in ctypes.cast(fieldL, ctypes.POINTER(ctypes.c_int))[:len(fields)]] fieldLen = [
ele for ele in ctypes.cast(
fieldL, ctypes.POINTER(
ctypes.c_int))[
:len(fields)]]
for i in range(len(fields)): for i in range(len(fields)):
data = ctypes.cast(pblock, ctypes.POINTER(ctypes.c_void_p))[i] data = ctypes.cast(pblock, ctypes.POINTER(ctypes.c_void_p))[i]
if fields[i]['type'] not in _CONVERT_FUNC_BLOCK: if fields[i]['type'] not in _CONVERT_FUNC_BLOCK:
raise DatabaseError("Invalid data type returned from database") raise DatabaseError("Invalid data type returned from database")
blocks[i] = _CONVERT_FUNC_BLOCK[fields[i]['type']](data, num_of_rows, fieldLen[i], isMicro) blocks[i] = _CONVERT_FUNC_BLOCK[fields[i]['type']](
data, num_of_rows, fieldLen[i], isMicro)
return blocks, abs(num_of_rows) return blocks, abs(num_of_rows)
@staticmethod @staticmethod
def fetchRow(result, fields): def fetchRow(result, fields):
pblock = ctypes.c_void_p(0) pblock = ctypes.c_void_p(0)
pblock = CTaosInterface.libtaos.taos_fetch_row(result) pblock = CTaosInterface.libtaos.taos_fetch_row(result)
if pblock : if pblock:
num_of_rows = 1 num_of_rows = 1
isMicro = (CTaosInterface.libtaos.taos_result_precision(result) == FieldType.C_TIMESTAMP_MICRO) isMicro = (CTaosInterface.libtaos.taos_result_precision(
result) == FieldType.C_TIMESTAMP_MICRO)
blocks = [None] * len(fields) blocks = [None] * len(fields)
fieldL = CTaosInterface.libtaos.taos_fetch_lengths(result) fieldL = CTaosInterface.libtaos.taos_fetch_lengths(result)
fieldLen = [ele for ele in ctypes.cast(fieldL, ctypes.POINTER(ctypes.c_int))[:len(fields)]] fieldLen = [
ele for ele in ctypes.cast(
fieldL, ctypes.POINTER(
ctypes.c_int))[
:len(fields)]]
for i in range(len(fields)): for i in range(len(fields)):
data = ctypes.cast(pblock, ctypes.POINTER(ctypes.c_void_p))[i] data = ctypes.cast(pblock, ctypes.POINTER(ctypes.c_void_p))[i]
if fields[i]['type'] not in _CONVERT_FUNC: if fields[i]['type'] not in _CONVERT_FUNC:
raise DatabaseError("Invalid data type returned from database") raise DatabaseError(
"Invalid data type returned from database")
if data is None: if data is None:
blocks[i] = [None] blocks[i] = [None]
else: else:
blocks[i] = _CONVERT_FUNC[fields[i]['type']](data, num_of_rows, fieldLen[i], isMicro) blocks[i] = _CONVERT_FUNC[fields[i]['type']](
data, num_of_rows, fieldLen[i], isMicro)
else: else:
return None, 0 return None, 0
return blocks, abs(num_of_rows) return blocks, abs(num_of_rows)
......
...@@ -2,9 +2,11 @@ from .cursor import TDengineCursor ...@@ -2,9 +2,11 @@ from .cursor import TDengineCursor
from .subscription import TDengineSubscription from .subscription import TDengineSubscription
from .cinterface import CTaosInterface from .cinterface import CTaosInterface
class TDengineConnection(object): class TDengineConnection(object):
""" TDengine connection object """ TDengine connection object
""" """
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
self._conn = None self._conn = None
self._host = None self._host = None
...@@ -29,7 +31,7 @@ class TDengineConnection(object): ...@@ -29,7 +31,7 @@ class TDengineConnection(object):
# password # password
if 'password' in kwargs: if 'password' in kwargs:
self._password = kwargs['password'] self._password = kwargs['password']
# database # database
if 'database' in kwargs: if 'database' in kwargs:
self._database = kwargs['database'] self._database = kwargs['database']
...@@ -43,7 +45,12 @@ class TDengineConnection(object): ...@@ -43,7 +45,12 @@ class TDengineConnection(object):
self._config = kwargs['config'] self._config = kwargs['config']
self._chandle = CTaosInterface(self._config) self._chandle = CTaosInterface(self._config)
self._conn = self._chandle.connect(self._host, self._user, self._password, self._database, self._port) self._conn = self._chandle.connect(
self._host,
self._user,
self._password,
self._database,
self._port)
def close(self): def close(self):
"""Close current connection. """Close current connection.
...@@ -55,7 +62,8 @@ class TDengineConnection(object): ...@@ -55,7 +62,8 @@ class TDengineConnection(object):
""" """
if self._conn is None: if self._conn is None:
return None return None
sub = CTaosInterface.subscribe(self._conn, restart, topic, sql, interval) sub = CTaosInterface.subscribe(
self._conn, restart, topic, sql, interval)
return TDengineSubscription(sub) return TDengineSubscription(sub)
def cursor(self): def cursor(self):
...@@ -80,7 +88,8 @@ class TDengineConnection(object): ...@@ -80,7 +88,8 @@ class TDengineConnection(object):
""" """
pass pass
if __name__ == "__main__": if __name__ == "__main__":
conn = TDengineConnection(host='192.168.1.107') conn = TDengineConnection(host='192.168.1.107')
conn.close() conn.close()
print("Hello world") print("Hello world")
\ No newline at end of file
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
from .dbapi import * from .dbapi import *
class FieldType(object): class FieldType(object):
"""TDengine Field Types """TDengine Field Types
""" """
...@@ -18,13 +19,21 @@ class FieldType(object): ...@@ -18,13 +19,21 @@ class FieldType(object):
C_BINARY = 8 C_BINARY = 8
C_TIMESTAMP = 9 C_TIMESTAMP = 9
C_NCHAR = 10 C_NCHAR = 10
C_TINYINT_UNSIGNED = 12
C_SMALLINT_UNSIGNED = 13
C_INT_UNSIGNED = 14
C_BIGINT_UNSIGNED = 15
# NULL value definition # NULL value definition
# NOTE: These values should change according to C definition in tsdb.h # NOTE: These values should change according to C definition in tsdb.h
C_BOOL_NULL = 0x02 C_BOOL_NULL = 0x02
C_TINYINT_NULL = -128 C_TINYINT_NULL = -128
C_TINYINT_UNSIGNED_NULL = 255
C_SMALLINT_NULL = -32768 C_SMALLINT_NULL = -32768
C_SMALLINT_UNSIGNED_NULL = 65535
C_INT_NULL = -2147483648 C_INT_NULL = -2147483648
C_INT_UNSIGNED_NULL = 4294967295
C_BIGINT_NULL = -9223372036854775808 C_BIGINT_NULL = -9223372036854775808
C_BIGINT_UNSIGNED_NULL = 18446744073709551615
C_FLOAT_NULL = float('nan') C_FLOAT_NULL = float('nan')
C_DOUBLE_NULL = float('nan') C_DOUBLE_NULL = float('nan')
C_BINARY_NULL = bytearray([int('0xff', 16)]) C_BINARY_NULL = bytearray([int('0xff', 16)])
......
...@@ -5,6 +5,7 @@ import threading ...@@ -5,6 +5,7 @@ import threading
# querySeqNum = 0 # querySeqNum = 0
class TDengineCursor(object): class TDengineCursor(object):
"""Database cursor which is used to manage the context of a fetch operation. """Database cursor which is used to manage the context of a fetch operation.
...@@ -107,8 +108,8 @@ class TDengineCursor(object): ...@@ -107,8 +108,8 @@ class TDengineCursor(object):
# if threading.get_ident() != self._threadId: # if threading.get_ident() != self._threadId:
# info ="Cursor execute:Thread ID not match,creater:"+str(self._threadId)+" caller:"+str(threading.get_ident()) # info ="Cursor execute:Thread ID not match,creater:"+str(self._threadId)+" caller:"+str(threading.get_ident())
# raise OperationalError(info) # raise OperationalError(info)
# print(info) # print(info)
# return None # return None
if not operation: if not operation:
return None return None
...@@ -137,8 +138,8 @@ class TDengineCursor(object): ...@@ -137,8 +138,8 @@ class TDengineCursor(object):
if errno == 0: if errno == 0:
if CTaosInterface.fieldsCount(self._result) == 0: if CTaosInterface.fieldsCount(self._result) == 0:
self._affected_rows += CTaosInterface.affectedRows( self._affected_rows += CTaosInterface.affectedRows(
self._result ) self._result)
return CTaosInterface.affectedRows(self._result ) return CTaosInterface.affectedRows(self._result)
else: else:
self._fields = CTaosInterface.useResult( self._fields = CTaosInterface.useResult(
self._result) self._result)
...@@ -168,11 +169,26 @@ class TDengineCursor(object): ...@@ -168,11 +169,26 @@ class TDengineCursor(object):
if (dataType.upper() == "TINYINT"): if (dataType.upper() == "TINYINT"):
if (self._description[col][1] == FieldType.C_TINYINT): if (self._description[col][1] == FieldType.C_TINYINT):
return True return True
if (dataType.upper() == "TINYINT UNSIGNED"):
if (self._description[col][1] == FieldType.C_TINYINT_UNSIGNED):
return True
if (dataType.upper() == "SMALLINT"):
if (self._description[col][1] == FieldType.C_SMALLINT):
return True
if (dataType.upper() == "SMALLINT UNSIGNED"):
if (self._description[col][1] == FieldType.C_SMALLINT_UNSIGNED):
return True
if (dataType.upper() == "INT"): if (dataType.upper() == "INT"):
if (self._description[col][1] == FieldType.C_INT): if (self._description[col][1] == FieldType.C_INT):
return True return True
if (dataType.upper() == "INT UNSIGNED"):
if (self._description[col][1] == FieldType.C_INT_UNSIGNED):
return True
if (dataType.upper() == "BIGINT"): if (dataType.upper() == "BIGINT"):
if (self._description[col][1] == FieldType.C_INT): if (self._description[col][1] == FieldType.C_BIGINT):
return True
if (dataType.upper() == "BIGINT UNSIGNED"):
if (self._description[col][1] == FieldType.C_BIGINT_UNSIGNED):
return True return True
if (dataType.upper() == "FLOAT"): if (dataType.upper() == "FLOAT"):
if (self._description[col][1] == FieldType.C_FLOAT): if (self._description[col][1] == FieldType.C_FLOAT):
...@@ -201,10 +217,13 @@ class TDengineCursor(object): ...@@ -201,10 +217,13 @@ class TDengineCursor(object):
buffer = [[] for i in range(len(self._fields))] buffer = [[] for i in range(len(self._fields))]
self._rowcount = 0 self._rowcount = 0
while True: while True:
block, num_of_fields = CTaosInterface.fetchRow(self._result, self._fields) block, num_of_fields = CTaosInterface.fetchRow(
self._result, self._fields)
errno = CTaosInterface.libtaos.taos_errno(self._result) errno = CTaosInterface.libtaos.taos_errno(self._result)
if errno != 0: if errno != 0:
raise ProgrammingError(CTaosInterface.errStr(self._result), errno) raise ProgrammingError(
CTaosInterface.errStr(
self._result), errno)
if num_of_fields == 0: if num_of_fields == 0:
break break
self._rowcount += num_of_fields self._rowcount += num_of_fields
...@@ -219,15 +238,20 @@ class TDengineCursor(object): ...@@ -219,15 +238,20 @@ class TDengineCursor(object):
buffer = [[] for i in range(len(self._fields))] buffer = [[] for i in range(len(self._fields))]
self._rowcount = 0 self._rowcount = 0
while True: while True:
block, num_of_fields = CTaosInterface.fetchBlock(self._result, self._fields) block, num_of_fields = CTaosInterface.fetchBlock(
self._result, self._fields)
errno = CTaosInterface.libtaos.taos_errno(self._result) errno = CTaosInterface.libtaos.taos_errno(self._result)
if errno != 0: if errno != 0:
raise ProgrammingError(CTaosInterface.errStr(self._result), errno) raise ProgrammingError(
if num_of_fields == 0: break CTaosInterface.errStr(
self._result), errno)
if num_of_fields == 0:
break
self._rowcount += num_of_fields self._rowcount += num_of_fields
for i in range(len(self._fields)): for i in range(len(self._fields)):
buffer[i].extend(block[i]) buffer[i].extend(block[i])
return list(map(tuple, zip(*buffer))) return list(map(tuple, zip(*buffer)))
def nextset(self): def nextset(self):
""" """
""" """
...@@ -259,8 +283,8 @@ class TDengineCursor(object): ...@@ -259,8 +283,8 @@ class TDengineCursor(object):
# if threading.get_ident() != self._threadId: # if threading.get_ident() != self._threadId:
# info = "Cursor handleresult:Thread ID not match,creater:"+str(self._threadId)+" caller:"+str(threading.get_ident()) # info = "Cursor handleresult:Thread ID not match,creater:"+str(self._threadId)+" caller:"+str(threading.get_ident())
# raise OperationalError(info) # raise OperationalError(info)
# print(info) # print(info)
# return None # return None
self._description = [] self._description = []
for ele in self._fields: for ele in self._fields:
...@@ -268,4 +292,3 @@ class TDengineCursor(object): ...@@ -268,4 +292,3 @@ class TDengineCursor(object):
(ele['name'], ele['type'], None, None, None, None, False)) (ele['name'], ele['type'], None, None, None, None, False))
return self._result return self._result
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
import time import time
import datetime import datetime
class DBAPITypeObject(object): class DBAPITypeObject(object):
def __init__(self, *values): def __init__(self, *values):
self.values = values self.values = values
...@@ -16,23 +17,28 @@ class DBAPITypeObject(object): ...@@ -16,23 +17,28 @@ class DBAPITypeObject(object):
else: else:
return -1 return -1
Date = datetime.date Date = datetime.date
Time = datetime.time Time = datetime.time
Timestamp = datetime.datetime Timestamp = datetime.datetime
def DataFromTicks(ticks): def DataFromTicks(ticks):
return Date(*time.localtime(ticks)[:3]) return Date(*time.localtime(ticks)[:3])
def TimeFromTicks(ticks): def TimeFromTicks(ticks):
return Time(*time.localtime(ticks)[3:6]) return Time(*time.localtime(ticks)[3:6])
def TimestampFromTicks(ticks): def TimestampFromTicks(ticks):
return Timestamp(*time.localtime(ticks)[:6]) return Timestamp(*time.localtime(ticks)[:6])
Binary = bytes Binary = bytes
# STRING = DBAPITypeObject(*constants.FieldType.get_string_types()) # STRING = DBAPITypeObject(*constants.FieldType.get_string_types())
# BINARY = DBAPITypeObject(*constants.FieldType.get_binary_types()) # BINARY = DBAPITypeObject(*constants.FieldType.get_binary_types())
# NUMBER = BAPITypeObject(*constants.FieldType.get_number_types()) # NUMBER = BAPITypeObject(*constants.FieldType.get_number_types())
# DATETIME = DBAPITypeObject(*constants.FieldType.get_timestamp_types()) # DATETIME = DBAPITypeObject(*constants.FieldType.get_timestamp_types())
# ROWID = DBAPITypeObject() # ROWID = DBAPITypeObject()
\ No newline at end of file
"""Python exceptions """Python exceptions
""" """
class Error(Exception): class Error(Exception):
def __init__(self, msg=None, errno=None): def __init__(self, msg=None, errno=None):
self.msg = msg self.msg = msg
self._full_msg = self.msg self._full_msg = self.msg
self.errno = errno self.errno = errno
def __str__(self): def __str__(self):
return self._full_msg return self._full_msg
class Warning(Exception): class Warning(Exception):
"""Exception raised for important warnings like data truncations while inserting. """Exception raised for important warnings like data truncations while inserting.
""" """
pass pass
class InterfaceError(Error): class InterfaceError(Error):
"""Exception raised for errors that are related to the database interface rather than the database itself. """Exception raised for errors that are related to the database interface rather than the database itself.
""" """
pass pass
class DatabaseError(Error): class DatabaseError(Error):
"""Exception raised for errors that are related to the database. """Exception raised for errors that are related to the database.
""" """
pass pass
class DataError(DatabaseError): class DataError(DatabaseError):
"""Exception raised for errors that are due to problems with the processed data like division by zero, numeric value out of range. """Exception raised for errors that are due to problems with the processed data like division by zero, numeric value out of range.
""" """
pass pass
class OperationalError(DatabaseError): class OperationalError(DatabaseError):
"""Exception raised for errors that are related to the database's operation and not necessarily under the control of the programmer """Exception raised for errors that are related to the database's operation and not necessarily under the control of the programmer
""" """
...@@ -41,17 +47,20 @@ class IntegrityError(DatabaseError): ...@@ -41,17 +47,20 @@ class IntegrityError(DatabaseError):
""" """
pass pass
class InternalError(DatabaseError): class InternalError(DatabaseError):
"""Exception raised when the database encounters an internal error. """Exception raised when the database encounters an internal error.
""" """
pass pass
class ProgrammingError(DatabaseError): class ProgrammingError(DatabaseError):
"""Exception raised for programming errors. """Exception raised for programming errors.
""" """
pass pass
class NotSupportedError(DatabaseError): class NotSupportedError(DatabaseError):
"""Exception raised in case a method or database API was used which is not supported by the database,. """Exception raised in case a method or database API was used which is not supported by the database,.
""" """
pass pass
\ No newline at end of file
from .cinterface import CTaosInterface from .cinterface import CTaosInterface
from .error import * from .error import *
class TDengineSubscription(object): class TDengineSubscription(object):
"""TDengine subscription object """TDengine subscription object
""" """
def __init__(self, sub): def __init__(self, sub):
self._sub = sub self._sub = sub
def consume(self): def consume(self):
"""Consume rows of a subscription """Consume rows of a subscription
""" """
if self._sub is None: if self._sub is None:
raise OperationalError("Invalid use of consume") raise OperationalError("Invalid use of consume")
result, fields = CTaosInterface.consume(self._sub) result, fields = CTaosInterface.consume(self._sub)
buffer = [[] for i in range(len(fields))] buffer = [[] for i in range(len(fields))]
while True: while True:
block, num_of_fields = CTaosInterface.fetchBlock(result, fields) block, num_of_fields = CTaosInterface.fetchBlock(result, fields)
if num_of_fields == 0: break if num_of_fields == 0:
break
for i in range(len(fields)): for i in range(len(fields)):
buffer[i].extend(block[i]) buffer[i].extend(block[i])
self.fields = fields self.fields = fields
return list(map(tuple, zip(*buffer))) return list(map(tuple, zip(*buffer)))
def close(self, keepProgress=True):
def close(self, keepProgress = True):
"""Close the Subscription. """Close the Subscription.
""" """
if self._sub is None: if self._sub is None:
...@@ -38,15 +39,19 @@ class TDengineSubscription(object): ...@@ -38,15 +39,19 @@ class TDengineSubscription(object):
if __name__ == '__main__': if __name__ == '__main__':
from .connection import TDengineConnection from .connection import TDengineConnection
conn = TDengineConnection(host="127.0.0.1", user="root", password="taosdata", database="test") conn = TDengineConnection(
host="127.0.0.1",
user="root",
password="taosdata",
database="test")
# Generate a cursor object to run SQL commands # Generate a cursor object to run SQL commands
sub = conn.subscribe(True, "test", "select * from meters;", 1000) sub = conn.subscribe(True, "test", "select * from meters;", 1000)
for i in range(0,10): for i in range(0, 10):
data = sub.consume() data = sub.consume()
for d in data: for d in data:
print(d) print(d)
sub.close() sub.close()
conn.close() conn.close()
\ No newline at end of file
...@@ -5,7 +5,7 @@ with open("README.md", "r") as fh: ...@@ -5,7 +5,7 @@ with open("README.md", "r") as fh:
setuptools.setup( setuptools.setup(
name="taos", name="taos",
version="2.0.4", version="2.0.5",
author="Taosdata Inc.", author="Taosdata Inc.",
author_email="support@taosdata.com", author_email="support@taosdata.com",
description="TDengine python client package", description="TDengine python client package",
......
...@@ -3,12 +3,12 @@ from .connection import TDengineConnection ...@@ -3,12 +3,12 @@ from .connection import TDengineConnection
from .cursor import TDengineCursor from .cursor import TDengineCursor
# Globals # Globals
apilevel = '2.0.4'
threadsafety = 0 threadsafety = 0
paramstyle = 'pyformat' paramstyle = 'pyformat'
__all__ = ['connection', 'cursor'] __all__ = ['connection', 'cursor']
def connect(*args, **kwargs): def connect(*args, **kwargs):
""" Function to return a TDengine connector object """ Function to return a TDengine connector object
......
...@@ -4,11 +4,14 @@ from .error import * ...@@ -4,11 +4,14 @@ from .error import *
import math import math
import datetime import datetime
def _convert_millisecond_to_datetime(milli): def _convert_millisecond_to_datetime(milli):
return datetime.datetime.fromtimestamp(milli/1000.0) return datetime.datetime.fromtimestamp(milli / 1000.0)
def _convert_microsecond_to_datetime(micro): def _convert_microsecond_to_datetime(micro):
return datetime.datetime.fromtimestamp(micro/1000000.0) return datetime.datetime.fromtimestamp(micro / 1000000.0)
def _crow_timestamp_to_python(data, num_of_rows, nbytes=None, micro=False): def _crow_timestamp_to_python(data, num_of_rows, nbytes=None, micro=False):
"""Function to convert C bool row to python row """Function to convert C bool row to python row
...@@ -18,168 +21,309 @@ def _crow_timestamp_to_python(data, num_of_rows, nbytes=None, micro=False): ...@@ -18,168 +21,309 @@ def _crow_timestamp_to_python(data, num_of_rows, nbytes=None, micro=False):
_timestamp_converter = _convert_microsecond_to_datetime _timestamp_converter = _convert_microsecond_to_datetime
if num_of_rows > 0: if num_of_rows > 0:
return list(map(_timestamp_converter, ctypes.cast(data, ctypes.POINTER(ctypes.c_long))[:abs(num_of_rows)])) return list(map(_timestamp_converter, ctypes.cast(
data, ctypes.POINTER(ctypes.c_long))[:abs(num_of_rows)]))
else: else:
return list(map(_timestamp_converter, ctypes.cast(data, ctypes.POINTER(ctypes.c_long))[:abs(num_of_rows)])) return list(map(_timestamp_converter, ctypes.cast(
data, ctypes.POINTER(ctypes.c_long))[:abs(num_of_rows)]))
def _crow_bool_to_python(data, num_of_rows, nbytes=None, micro=False): def _crow_bool_to_python(data, num_of_rows, nbytes=None, micro=False):
"""Function to convert C bool row to python row """Function to convert C bool row to python row
""" """
if num_of_rows > 0: if num_of_rows > 0:
return [ None if ele == FieldType.C_BOOL_NULL else bool(ele) for ele in ctypes.cast(data, ctypes.POINTER(ctypes.c_byte))[:abs(num_of_rows)] ] return [
None if ele == FieldType.C_BOOL_NULL else bool(ele) for ele in ctypes.cast(
data, ctypes.POINTER(
ctypes.c_byte))[
:abs(num_of_rows)]]
else: else:
return [ None if ele == FieldType.C_BOOL_NULL else bool(ele) for ele in ctypes.cast(data, ctypes.POINTER(ctypes.c_bool))[:abs(num_of_rows)] ] return [
None if ele == FieldType.C_BOOL_NULL else bool(ele) for ele in ctypes.cast(
data, ctypes.POINTER(
ctypes.c_bool))[
:abs(num_of_rows)]]
def _crow_tinyint_to_python(data, num_of_rows, nbytes=None, micro=False): def _crow_tinyint_to_python(data, num_of_rows, nbytes=None, micro=False):
"""Function to convert C tinyint row to python row """Function to convert C tinyint row to python row
""" """
if num_of_rows > 0: if num_of_rows > 0:
return [ None if ele == FieldType.C_TINYINT_NULL else ele for ele in ctypes.cast(data, ctypes.POINTER(ctypes.c_byte))[:abs(num_of_rows)] ] return [None if ele == FieldType.C_TINYINT_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(ctypes.c_byte))[:abs(num_of_rows)]]
else:
return [None if ele == FieldType.C_TINYINT_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(ctypes.c_byte))[:abs(num_of_rows)]]
def _crow_tinyint_unsigned_to_python(
data,
num_of_rows,
nbytes=None,
micro=False):
"""Function to convert C tinyint row to python row
"""
if num_of_rows > 0:
return [
None if ele == FieldType.C_TINYINT_UNSIGNED_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(
ctypes.c_byte))[
:abs(num_of_rows)]]
else: else:
return [ None if ele == FieldType.C_TINYINT_NULL else ele for ele in ctypes.cast(data, ctypes.POINTER(ctypes.c_byte))[:abs(num_of_rows)] ] return [
None if ele == FieldType.C_TINYINT_UNSIGNED_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(
ctypes.c_byte))[
:abs(num_of_rows)]]
def _crow_smallint_to_python(data, num_of_rows, nbytes=None, micro=False): def _crow_smallint_to_python(data, num_of_rows, nbytes=None, micro=False):
"""Function to convert C smallint row to python row """Function to convert C smallint row to python row
""" """
if num_of_rows > 0: if num_of_rows > 0:
return [ None if ele == FieldType.C_SMALLINT_NULL else ele for ele in ctypes.cast(data, ctypes.POINTER(ctypes.c_short))[:abs(num_of_rows)]] return [
None if ele == FieldType.C_SMALLINT_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(
ctypes.c_short))[
:abs(num_of_rows)]]
else: else:
return [ None if ele == FieldType.C_SMALLINT_NULL else ele for ele in ctypes.cast(data, ctypes.POINTER(ctypes.c_short))[:abs(num_of_rows)] ] return [
None if ele == FieldType.C_SMALLINT_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(
ctypes.c_short))[
:abs(num_of_rows)]]
def _crow_smallint_unsigned_to_python(
data, num_of_rows, nbytes=None, micro=False):
"""Function to convert C smallint row to python row
"""
if num_of_rows > 0:
return [
None if ele == FieldType.C_SMALLINT_UNSIGNED_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(
ctypes.c_short))[
:abs(num_of_rows)]]
else:
return [
None if ele == FieldType.C_SMALLINT_UNSIGNED_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(
ctypes.c_short))[
:abs(num_of_rows)]]
def _crow_int_to_python(data, num_of_rows, nbytes=None, micro=False): def _crow_int_to_python(data, num_of_rows, nbytes=None, micro=False):
"""Function to convert C int row to python row """Function to convert C int row to python row
""" """
if num_of_rows > 0: if num_of_rows > 0:
return [ None if ele == FieldType.C_INT_NULL else ele for ele in ctypes.cast(data, ctypes.POINTER(ctypes.c_int))[:abs(num_of_rows)] ] return [None if ele == FieldType.C_INT_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(ctypes.c_int))[:abs(num_of_rows)]]
else:
return [None if ele == FieldType.C_INT_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(ctypes.c_int))[:abs(num_of_rows)]]
def _crow_int_unsigned_to_python(data, num_of_rows, nbytes=None, micro=False):
"""Function to convert C int row to python row
"""
if num_of_rows > 0:
return [
None if ele == FieldType.C_INT_UNSIGNED_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(
ctypes.c_int))[
:abs(num_of_rows)]]
else: else:
return [ None if ele == FieldType.C_INT_NULL else ele for ele in ctypes.cast(data, ctypes.POINTER(ctypes.c_int))[:abs(num_of_rows)] ] return [
None if ele == FieldType.C_INT_UNSIGNED_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(
ctypes.c_int))[
:abs(num_of_rows)]]
def _crow_bigint_to_python(data, num_of_rows, nbytes=None, micro=False): def _crow_bigint_to_python(data, num_of_rows, nbytes=None, micro=False):
"""Function to convert C bigint row to python row """Function to convert C bigint row to python row
""" """
if num_of_rows > 0: if num_of_rows > 0:
return [ None if ele == FieldType.C_BIGINT_NULL else ele for ele in ctypes.cast(data, ctypes.POINTER(ctypes.c_long))[:abs(num_of_rows)] ] return [None if ele == FieldType.C_BIGINT_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(ctypes.c_long))[:abs(num_of_rows)]]
else:
return [None if ele == FieldType.C_BIGINT_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(ctypes.c_long))[:abs(num_of_rows)]]
def _crow_bigint_unsigned_to_python(
data,
num_of_rows,
nbytes=None,
micro=False):
"""Function to convert C bigint row to python row
"""
if num_of_rows > 0:
return [
None if ele == FieldType.C_BIGINT_UNSIGNED_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(
ctypes.c_long))[
:abs(num_of_rows)]]
else: else:
return [ None if ele == FieldType.C_BIGINT_NULL else ele for ele in ctypes.cast(data, ctypes.POINTER(ctypes.c_long))[:abs(num_of_rows)] ] return [
None if ele == FieldType.C_BIGINT_UNSIGNED_NULL else ele for ele in ctypes.cast(
data, ctypes.POINTER(
ctypes.c_long))[
:abs(num_of_rows)]]
def _crow_float_to_python(data, num_of_rows, nbytes=None, micro=False): def _crow_float_to_python(data, num_of_rows, nbytes=None, micro=False):
"""Function to convert C float row to python row """Function to convert C float row to python row
""" """
if num_of_rows > 0: if num_of_rows > 0:
return [ None if math.isnan(ele) else ele for ele in ctypes.cast(data, ctypes.POINTER(ctypes.c_float))[:abs(num_of_rows)] ] return [None if math.isnan(ele) else ele for ele in ctypes.cast(
data, ctypes.POINTER(ctypes.c_float))[:abs(num_of_rows)]]
else: else:
return [ None if math.isnan(ele) else ele for ele in ctypes.cast(data, ctypes.POINTER(ctypes.c_float))[:abs(num_of_rows)] ] return [None if math.isnan(ele) else ele for ele in ctypes.cast(
data, ctypes.POINTER(ctypes.c_float))[:abs(num_of_rows)]]
def _crow_double_to_python(data, num_of_rows, nbytes=None, micro=False): def _crow_double_to_python(data, num_of_rows, nbytes=None, micro=False):
"""Function to convert C double row to python row """Function to convert C double row to python row
""" """
if num_of_rows > 0: if num_of_rows > 0:
return [ None if math.isnan(ele) else ele for ele in ctypes.cast(data, ctypes.POINTER(ctypes.c_double))[:abs(num_of_rows)] ] return [None if math.isnan(ele) else ele for ele in ctypes.cast(
data, ctypes.POINTER(ctypes.c_double))[:abs(num_of_rows)]]
else: else:
return [ None if math.isnan(ele) else ele for ele in ctypes.cast(data, ctypes.POINTER(ctypes.c_double))[:abs(num_of_rows)] ] return [None if math.isnan(ele) else ele for ele in ctypes.cast(
data, ctypes.POINTER(ctypes.c_double))[:abs(num_of_rows)]]
def _crow_binary_to_python(data, num_of_rows, nbytes=None, micro=False): def _crow_binary_to_python(data, num_of_rows, nbytes=None, micro=False):
"""Function to convert C binary row to python row """Function to convert C binary row to python row
""" """
assert(nbytes is not None) assert(nbytes is not None)
if num_of_rows > 0: if num_of_rows > 0:
return [ None if ele.value[0:1] == FieldType.C_BINARY_NULL else ele.value.decode('utf-8') for ele in (ctypes.cast(data, ctypes.POINTER(ctypes.c_char * nbytes)))[:abs(num_of_rows)]] return [None if ele.value[0:1] == FieldType.C_BINARY_NULL else ele.value.decode(
'utf-8') for ele in (ctypes.cast(data, ctypes.POINTER(ctypes.c_char * nbytes)))[:abs(num_of_rows)]]
else: else:
return [ None if ele.value[0:1] == FieldType.C_BINARY_NULL else ele.value.decode('utf-8') for ele in (ctypes.cast(data, ctypes.POINTER(ctypes.c_char * nbytes)))[:abs(num_of_rows)]] return [None if ele.value[0:1] == FieldType.C_BINARY_NULL else ele.value.decode(
'utf-8') for ele in (ctypes.cast(data, ctypes.POINTER(ctypes.c_char * nbytes)))[:abs(num_of_rows)]]
def _crow_nchar_to_python(data, num_of_rows, nbytes=None, micro=False): def _crow_nchar_to_python(data, num_of_rows, nbytes=None, micro=False):
"""Function to convert C nchar row to python row """Function to convert C nchar row to python row
""" """
assert(nbytes is not None) assert(nbytes is not None)
res=[] res = []
for i in range(abs(num_of_rows)): for i in range(abs(num_of_rows)):
try: try:
if num_of_rows >= 0: if num_of_rows >= 0:
tmpstr = ctypes.c_char_p(data) tmpstr = ctypes.c_char_p(data)
res.append( tmpstr.value.decode() ) res.append(tmpstr.value.decode())
else: else:
res.append( (ctypes.cast(data+nbytes*i, ctypes.POINTER(ctypes.c_wchar * (nbytes//4))))[0].value ) res.append((ctypes.cast(data + nbytes * i,
ctypes.POINTER(ctypes.c_wchar * (nbytes // 4))))[0].value)
except ValueError: except ValueError:
res.append(None) res.append(None)
return res return res
def _crow_binary_to_python_block(data, num_of_rows, nbytes=None, micro=False): def _crow_binary_to_python_block(data, num_of_rows, nbytes=None, micro=False):
"""Function to convert C binary row to python row """Function to convert C binary row to python row
""" """
assert(nbytes is not None) assert(nbytes is not None)
res=[] res = []
if num_of_rows > 0: if num_of_rows > 0:
for i in range(abs(num_of_rows)): for i in range(abs(num_of_rows)):
try: try:
rbyte=ctypes.cast(data+nbytes*i,ctypes.POINTER(ctypes.c_short))[:1].pop() rbyte = ctypes.cast(
tmpstr = ctypes.c_char_p(data+nbytes*i+2) data + nbytes * i,
res.append( tmpstr.value.decode()[0:rbyte] ) ctypes.POINTER(
ctypes.c_short))[
:1].pop()
tmpstr = ctypes.c_char_p(data + nbytes * i + 2)
res.append(tmpstr.value.decode()[0:rbyte])
except ValueError: except ValueError:
res.append(None) res.append(None)
else: else:
for i in range(abs(num_of_rows)): for i in range(abs(num_of_rows)):
try: try:
rbyte=ctypes.cast(data+nbytes*i,ctypes.POINTER(ctypes.c_short))[:1].pop() rbyte = ctypes.cast(
tmpstr = ctypes.c_char_p(data+nbytes*i+2) data + nbytes * i,
res.append( tmpstr.value.decode()[0:rbyte] ) ctypes.POINTER(
ctypes.c_short))[
:1].pop()
tmpstr = ctypes.c_char_p(data + nbytes * i + 2)
res.append(tmpstr.value.decode()[0:rbyte])
except ValueError: except ValueError:
res.append(None) res.append(None)
return res return res
def _crow_nchar_to_python_block(data, num_of_rows, nbytes=None, micro=False): def _crow_nchar_to_python_block(data, num_of_rows, nbytes=None, micro=False):
"""Function to convert C nchar row to python row """Function to convert C nchar row to python row
""" """
assert(nbytes is not None) assert(nbytes is not None)
res=[] res = []
if num_of_rows >= 0: if num_of_rows >= 0:
for i in range(abs(num_of_rows)): for i in range(abs(num_of_rows)):
try: try:
tmpstr = ctypes.c_char_p(data+nbytes*i+2) tmpstr = ctypes.c_char_p(data + nbytes * i + 2)
res.append( tmpstr.value.decode() ) res.append(tmpstr.value.decode())
except ValueError: except ValueError:
res.append(None) res.append(None)
else: else:
for i in range(abs(num_of_rows)): for i in range(abs(num_of_rows)):
try: try:
res.append( (ctypes.cast(data+nbytes*i+2, ctypes.POINTER(ctypes.c_wchar * (nbytes//4))))[0].value ) res.append((ctypes.cast(data + nbytes * i + 2,
ctypes.POINTER(ctypes.c_wchar * (nbytes // 4))))[0].value)
except ValueError: except ValueError:
res.append(None) res.append(None)
return res return res
_CONVERT_FUNC = { _CONVERT_FUNC = {
FieldType.C_BOOL: _crow_bool_to_python, FieldType.C_BOOL: _crow_bool_to_python,
FieldType.C_TINYINT : _crow_tinyint_to_python, FieldType.C_TINYINT: _crow_tinyint_to_python,
FieldType.C_SMALLINT : _crow_smallint_to_python, FieldType.C_SMALLINT: _crow_smallint_to_python,
FieldType.C_INT : _crow_int_to_python, FieldType.C_INT: _crow_int_to_python,
FieldType.C_BIGINT : _crow_bigint_to_python, FieldType.C_BIGINT: _crow_bigint_to_python,
FieldType.C_FLOAT : _crow_float_to_python, FieldType.C_FLOAT: _crow_float_to_python,
FieldType.C_DOUBLE : _crow_double_to_python, FieldType.C_DOUBLE: _crow_double_to_python,
FieldType.C_BINARY: _crow_binary_to_python, FieldType.C_BINARY: _crow_binary_to_python,
FieldType.C_TIMESTAMP : _crow_timestamp_to_python, FieldType.C_TIMESTAMP: _crow_timestamp_to_python,
FieldType.C_NCHAR : _crow_nchar_to_python FieldType.C_NCHAR: _crow_nchar_to_python,
FieldType.C_TINYINT_UNSIGNED: _crow_tinyint_unsigned_to_python,
FieldType.C_SMALLINT_UNSIGNED: _crow_smallint_unsigned_to_python,
FieldType.C_INT_UNSIGNED: _crow_int_unsigned_to_python,
FieldType.C_BIGINT_UNSIGNED: _crow_bigint_unsigned_to_python
} }
_CONVERT_FUNC_BLOCK = { _CONVERT_FUNC_BLOCK = {
FieldType.C_BOOL: _crow_bool_to_python, FieldType.C_BOOL: _crow_bool_to_python,
FieldType.C_TINYINT : _crow_tinyint_to_python, FieldType.C_TINYINT: _crow_tinyint_to_python,
FieldType.C_SMALLINT : _crow_smallint_to_python, FieldType.C_SMALLINT: _crow_smallint_to_python,
FieldType.C_INT : _crow_int_to_python, FieldType.C_INT: _crow_int_to_python,
FieldType.C_BIGINT : _crow_bigint_to_python, FieldType.C_BIGINT: _crow_bigint_to_python,
FieldType.C_FLOAT : _crow_float_to_python, FieldType.C_FLOAT: _crow_float_to_python,
FieldType.C_DOUBLE : _crow_double_to_python, FieldType.C_DOUBLE: _crow_double_to_python,
FieldType.C_BINARY: _crow_binary_to_python_block, FieldType.C_BINARY: _crow_binary_to_python_block,
FieldType.C_TIMESTAMP : _crow_timestamp_to_python, FieldType.C_TIMESTAMP: _crow_timestamp_to_python,
FieldType.C_NCHAR : _crow_nchar_to_python_block FieldType.C_NCHAR: _crow_nchar_to_python_block,
FieldType.C_TINYINT_UNSIGNED: _crow_tinyint_unsigned_to_python,
FieldType.C_SMALLINT_UNSIGNED: _crow_smallint_unsigned_to_python,
FieldType.C_INT_UNSIGNED: _crow_int_unsigned_to_python,
FieldType.C_BIGINT_UNSIGNED: _crow_bigint_unsigned_to_python
} }
# Corresponding TAOS_FIELD structure in C # Corresponding TAOS_FIELD structure in C
class TaosField(ctypes.Structure): class TaosField(ctypes.Structure):
_fields_ = [('name', ctypes.c_char * 65), _fields_ = [('name', ctypes.c_char * 65),
('type', ctypes.c_char), ('type', ctypes.c_char),
('bytes', ctypes.c_short)] ('bytes', ctypes.c_short)]
# C interface class # C interface class
class CTaosInterface(object): class CTaosInterface(object):
libtaos = ctypes.CDLL('libtaos.dylib') libtaos = ctypes.CDLL('libtaos.dylib')
...@@ -216,7 +360,7 @@ class CTaosInterface(object): ...@@ -216,7 +360,7 @@ class CTaosInterface(object):
except AttributeError: except AttributeError:
raise AttributeError("config is expected as a str") raise AttributeError("config is expected as a str")
if config != None: if config is not None:
CTaosInterface.libtaos.taos_options(3, self._config) CTaosInterface.libtaos.taos_options(3, self._config)
CTaosInterface.libtaos.taos_init() CTaosInterface.libtaos.taos_init()
...@@ -227,7 +371,13 @@ class CTaosInterface(object): ...@@ -227,7 +371,13 @@ class CTaosInterface(object):
""" """
return self._config return self._config
def connect(self, host=None, user="root", password="taosdata", db=None, port=0): def connect(
self,
host=None,
user="root",
password="taosdata",
db=None,
port=0):
''' '''
Function to connect to server Function to connect to server
...@@ -236,7 +386,7 @@ class CTaosInterface(object): ...@@ -236,7 +386,7 @@ class CTaosInterface(object):
# host # host
try: try:
_host = ctypes.c_char_p(host.encode( _host = ctypes.c_char_p(host.encode(
"utf-8")) if host != None else ctypes.c_char_p(None) "utf-8")) if host is not None else ctypes.c_char_p(None)
except AttributeError: except AttributeError:
raise AttributeError("host is expected as a str") raise AttributeError("host is expected as a str")
...@@ -255,7 +405,7 @@ class CTaosInterface(object): ...@@ -255,7 +405,7 @@ class CTaosInterface(object):
# db # db
try: try:
_db = ctypes.c_char_p( _db = ctypes.c_char_p(
db.encode("utf-8")) if db != None else ctypes.c_char_p(None) db.encode("utf-8")) if db is not None else ctypes.c_char_p(None)
except AttributeError: except AttributeError:
raise AttributeError("db is expected as a str") raise AttributeError("db is expected as a str")
...@@ -268,11 +418,11 @@ class CTaosInterface(object): ...@@ -268,11 +418,11 @@ class CTaosInterface(object):
connection = ctypes.c_void_p(CTaosInterface.libtaos.taos_connect( connection = ctypes.c_void_p(CTaosInterface.libtaos.taos_connect(
_host, _user, _password, _db, _port)) _host, _user, _password, _db, _port))
if connection.value == None: if connection.value is None:
print('connect to TDengine failed') print('connect to TDengine failed')
raise ConnectionError("connect to TDengine failed") raise ConnectionError("connect to TDengine failed")
# sys.exit(1) # sys.exit(1)
#else: # else:
# print('connect to TDengine success') # print('connect to TDengine success')
return connection return connection
...@@ -293,7 +443,8 @@ class CTaosInterface(object): ...@@ -293,7 +443,8 @@ class CTaosInterface(object):
@rtype: 0 on success and -1 on failure @rtype: 0 on success and -1 on failure
''' '''
try: try:
return CTaosInterface.libtaos.taos_query(connection, ctypes.c_char_p(sql.encode('utf-8'))) return CTaosInterface.libtaos.taos_query(
connection, ctypes.c_char_p(sql.encode('utf-8')))
except AttributeError: except AttributeError:
raise AttributeError("sql is expected as a string") raise AttributeError("sql is expected as a string")
# finally: # finally:
...@@ -308,7 +459,7 @@ class CTaosInterface(object): ...@@ -308,7 +459,7 @@ class CTaosInterface(object):
@staticmethod @staticmethod
def subscribe(connection, restart, topic, sql, interval): def subscribe(connection, restart, topic, sql, interval):
"""Create a subscription """Create a subscription
@restart boolean, @restart boolean,
@sql string, sql statement for data query, must be a 'select' statement. @sql string, sql statement for data query, must be a 'select' statement.
@topic string, name of this subscription @topic string, name of this subscription
""" """
...@@ -360,35 +511,49 @@ class CTaosInterface(object): ...@@ -360,35 +511,49 @@ class CTaosInterface(object):
result, ctypes.byref(pblock)) result, ctypes.byref(pblock))
if num_of_rows == 0: if num_of_rows == 0:
return None, 0 return None, 0
isMicro = (CTaosInterface.libtaos.taos_result_precision(result) == FieldType.C_TIMESTAMP_MICRO) isMicro = (CTaosInterface.libtaos.taos_result_precision(
result) == FieldType.C_TIMESTAMP_MICRO)
blocks = [None] * len(fields) blocks = [None] * len(fields)
fieldL = CTaosInterface.libtaos.taos_fetch_lengths(result) fieldL = CTaosInterface.libtaos.taos_fetch_lengths(result)
fieldLen = [ele for ele in ctypes.cast(fieldL, ctypes.POINTER(ctypes.c_int))[:len(fields)]] fieldLen = [
ele for ele in ctypes.cast(
fieldL, ctypes.POINTER(
ctypes.c_int))[
:len(fields)]]
for i in range(len(fields)): for i in range(len(fields)):
data = ctypes.cast(pblock, ctypes.POINTER(ctypes.c_void_p))[i] data = ctypes.cast(pblock, ctypes.POINTER(ctypes.c_void_p))[i]
if fields[i]['type'] not in _CONVERT_FUNC_BLOCK: if fields[i]['type'] not in _CONVERT_FUNC_BLOCK:
raise DatabaseError("Invalid data type returned from database") raise DatabaseError("Invalid data type returned from database")
blocks[i] = _CONVERT_FUNC_BLOCK[fields[i]['type']](data, num_of_rows, fieldLen[i], isMicro) blocks[i] = _CONVERT_FUNC_BLOCK[fields[i]['type']](
data, num_of_rows, fieldLen[i], isMicro)
return blocks, abs(num_of_rows) return blocks, abs(num_of_rows)
@staticmethod @staticmethod
def fetchRow(result, fields): def fetchRow(result, fields):
pblock = ctypes.c_void_p(0) pblock = ctypes.c_void_p(0)
pblock = CTaosInterface.libtaos.taos_fetch_row(result) pblock = CTaosInterface.libtaos.taos_fetch_row(result)
if pblock : if pblock:
num_of_rows = 1 num_of_rows = 1
isMicro = (CTaosInterface.libtaos.taos_result_precision(result) == FieldType.C_TIMESTAMP_MICRO) isMicro = (CTaosInterface.libtaos.taos_result_precision(
result) == FieldType.C_TIMESTAMP_MICRO)
blocks = [None] * len(fields) blocks = [None] * len(fields)
fieldL = CTaosInterface.libtaos.taos_fetch_lengths(result) fieldL = CTaosInterface.libtaos.taos_fetch_lengths(result)
fieldLen = [ele for ele in ctypes.cast(fieldL, ctypes.POINTER(ctypes.c_int))[:len(fields)]] fieldLen = [
ele for ele in ctypes.cast(
fieldL, ctypes.POINTER(
ctypes.c_int))[
:len(fields)]]
for i in range(len(fields)): for i in range(len(fields)):
data = ctypes.cast(pblock, ctypes.POINTER(ctypes.c_void_p))[i] data = ctypes.cast(pblock, ctypes.POINTER(ctypes.c_void_p))[i]
if fields[i]['type'] not in _CONVERT_FUNC: if fields[i]['type'] not in _CONVERT_FUNC:
raise DatabaseError("Invalid data type returned from database") raise DatabaseError(
"Invalid data type returned from database")
if data is None: if data is None:
blocks[i] = [None] blocks[i] = [None]
else: else:
blocks[i] = _CONVERT_FUNC[fields[i]['type']](data, num_of_rows, fieldLen[i], isMicro) blocks[i] = _CONVERT_FUNC[fields[i]['type']](
data, num_of_rows, fieldLen[i], isMicro)
else: else:
return None, 0 return None, 0
return blocks, abs(num_of_rows) return blocks, abs(num_of_rows)
......
...@@ -2,9 +2,11 @@ from .cursor import TDengineCursor ...@@ -2,9 +2,11 @@ from .cursor import TDengineCursor
from .subscription import TDengineSubscription from .subscription import TDengineSubscription
from .cinterface import CTaosInterface from .cinterface import CTaosInterface
class TDengineConnection(object): class TDengineConnection(object):
""" TDengine connection object """ TDengine connection object
""" """
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
self._conn = None self._conn = None
self._host = None self._host = None
...@@ -29,7 +31,7 @@ class TDengineConnection(object): ...@@ -29,7 +31,7 @@ class TDengineConnection(object):
# password # password
if 'password' in kwargs: if 'password' in kwargs:
self._password = kwargs['password'] self._password = kwargs['password']
# database # database
if 'database' in kwargs: if 'database' in kwargs:
self._database = kwargs['database'] self._database = kwargs['database']
...@@ -43,7 +45,12 @@ class TDengineConnection(object): ...@@ -43,7 +45,12 @@ class TDengineConnection(object):
self._config = kwargs['config'] self._config = kwargs['config']
self._chandle = CTaosInterface(self._config) self._chandle = CTaosInterface(self._config)
self._conn = self._chandle.connect(self._host, self._user, self._password, self._database, self._port) self._conn = self._chandle.connect(
self._host,
self._user,
self._password,
self._database,
self._port)
def close(self): def close(self):
"""Close current connection. """Close current connection.
...@@ -55,7 +62,8 @@ class TDengineConnection(object): ...@@ -55,7 +62,8 @@ class TDengineConnection(object):
""" """
if self._conn is None: if self._conn is None:
return None return None
sub = CTaosInterface.subscribe(self._conn, restart, topic, sql, interval) sub = CTaosInterface.subscribe(
self._conn, restart, topic, sql, interval)
return TDengineSubscription(sub) return TDengineSubscription(sub)
def cursor(self): def cursor(self):
...@@ -80,7 +88,8 @@ class TDengineConnection(object): ...@@ -80,7 +88,8 @@ class TDengineConnection(object):
""" """
pass pass
if __name__ == "__main__": if __name__ == "__main__":
conn = TDengineConnection(host='192.168.1.107') conn = TDengineConnection(host='192.168.1.107')
conn.close() conn.close()
print("Hello world") print("Hello world")
\ No newline at end of file
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
from .dbapi import * from .dbapi import *
class FieldType(object): class FieldType(object):
"""TDengine Field Types """TDengine Field Types
""" """
...@@ -18,13 +19,21 @@ class FieldType(object): ...@@ -18,13 +19,21 @@ class FieldType(object):
C_BINARY = 8 C_BINARY = 8
C_TIMESTAMP = 9 C_TIMESTAMP = 9
C_NCHAR = 10 C_NCHAR = 10
C_TINYINT_UNSIGNED = 12
C_SMALLINT_UNSIGNED = 13
C_INT_UNSIGNED = 14
C_BIGINT_UNSIGNED = 15
# NULL value definition # NULL value definition
# NOTE: These values should change according to C definition in tsdb.h # NOTE: These values should change according to C definition in tsdb.h
C_BOOL_NULL = 0x02 C_BOOL_NULL = 0x02
C_TINYINT_NULL = -128 C_TINYINT_NULL = -128
C_TINYINT_UNSIGNED_NULL = 255
C_SMALLINT_NULL = -32768 C_SMALLINT_NULL = -32768
C_SMALLINT_UNSIGNED_NULL = 65535
C_INT_NULL = -2147483648 C_INT_NULL = -2147483648
C_INT_UNSIGNED_NULL = 4294967295
C_BIGINT_NULL = -9223372036854775808 C_BIGINT_NULL = -9223372036854775808
C_BIGINT_UNSIGNED_NULL = 18446744073709551615
C_FLOAT_NULL = float('nan') C_FLOAT_NULL = float('nan')
C_DOUBLE_NULL = float('nan') C_DOUBLE_NULL = float('nan')
C_BINARY_NULL = bytearray([int('0xff', 16)]) C_BINARY_NULL = bytearray([int('0xff', 16)])
......
...@@ -5,6 +5,7 @@ import threading ...@@ -5,6 +5,7 @@ import threading
# querySeqNum = 0 # querySeqNum = 0
class TDengineCursor(object): class TDengineCursor(object):
"""Database cursor which is used to manage the context of a fetch operation. """Database cursor which is used to manage the context of a fetch operation.
...@@ -107,8 +108,8 @@ class TDengineCursor(object): ...@@ -107,8 +108,8 @@ class TDengineCursor(object):
# if threading.get_ident() != self._threadId: # if threading.get_ident() != self._threadId:
# info ="Cursor execute:Thread ID not match,creater:"+str(self._threadId)+" caller:"+str(threading.get_ident()) # info ="Cursor execute:Thread ID not match,creater:"+str(self._threadId)+" caller:"+str(threading.get_ident())
# raise OperationalError(info) # raise OperationalError(info)
# print(info) # print(info)
# return None # return None
if not operation: if not operation:
return None return None
...@@ -137,8 +138,8 @@ class TDengineCursor(object): ...@@ -137,8 +138,8 @@ class TDengineCursor(object):
if errno == 0: if errno == 0:
if CTaosInterface.fieldsCount(self._result) == 0: if CTaosInterface.fieldsCount(self._result) == 0:
self._affected_rows += CTaosInterface.affectedRows( self._affected_rows += CTaosInterface.affectedRows(
self._result ) self._result)
return CTaosInterface.affectedRows(self._result ) return CTaosInterface.affectedRows(self._result)
else: else:
self._fields = CTaosInterface.useResult( self._fields = CTaosInterface.useResult(
self._result) self._result)
...@@ -168,11 +169,26 @@ class TDengineCursor(object): ...@@ -168,11 +169,26 @@ class TDengineCursor(object):
if (dataType.upper() == "TINYINT"): if (dataType.upper() == "TINYINT"):
if (self._description[col][1] == FieldType.C_TINYINT): if (self._description[col][1] == FieldType.C_TINYINT):
return True return True
if (dataType.upper() == "TINYINT UNSIGNED"):
if (self._description[col][1] == FieldType.C_TINYINT_UNSIGNED):
return True
if (dataType.upper() == "SMALLINT"):
if (self._description[col][1] == FieldType.C_SMALLINT):
return True
if (dataType.upper() == "SMALLINT UNSIGNED"):
if (self._description[col][1] == FieldType.C_SMALLINT_UNSIGNED):
return True
if (dataType.upper() == "INT"): if (dataType.upper() == "INT"):
if (self._description[col][1] == FieldType.C_INT): if (self._description[col][1] == FieldType.C_INT):
return True return True
if (dataType.upper() == "INT UNSIGNED"):
if (self._description[col][1] == FieldType.C_INT_UNSIGNED):
return True
if (dataType.upper() == "BIGINT"): if (dataType.upper() == "BIGINT"):
if (self._description[col][1] == FieldType.C_INT): if (self._description[col][1] == FieldType.C_BIGINT):
return True
if (dataType.upper() == "BIGINT UNSIGNED"):
if (self._description[col][1] == FieldType.C_BIGINT_UNSIGNED):
return True return True
if (dataType.upper() == "FLOAT"): if (dataType.upper() == "FLOAT"):
if (self._description[col][1] == FieldType.C_FLOAT): if (self._description[col][1] == FieldType.C_FLOAT):
...@@ -201,10 +217,13 @@ class TDengineCursor(object): ...@@ -201,10 +217,13 @@ class TDengineCursor(object):
buffer = [[] for i in range(len(self._fields))] buffer = [[] for i in range(len(self._fields))]
self._rowcount = 0 self._rowcount = 0
while True: while True:
block, num_of_fields = CTaosInterface.fetchRow(self._result, self._fields) block, num_of_fields = CTaosInterface.fetchRow(
self._result, self._fields)
errno = CTaosInterface.libtaos.taos_errno(self._result) errno = CTaosInterface.libtaos.taos_errno(self._result)
if errno != 0: if errno != 0:
raise ProgrammingError(CTaosInterface.errStr(self._result), errno) raise ProgrammingError(
CTaosInterface.errStr(
self._result), errno)
if num_of_fields == 0: if num_of_fields == 0:
break break
self._rowcount += num_of_fields self._rowcount += num_of_fields
...@@ -219,15 +238,20 @@ class TDengineCursor(object): ...@@ -219,15 +238,20 @@ class TDengineCursor(object):
buffer = [[] for i in range(len(self._fields))] buffer = [[] for i in range(len(self._fields))]
self._rowcount = 0 self._rowcount = 0
while True: while True:
block, num_of_fields = CTaosInterface.fetchBlock(self._result, self._fields) block, num_of_fields = CTaosInterface.fetchBlock(
self._result, self._fields)
errno = CTaosInterface.libtaos.taos_errno(self._result) errno = CTaosInterface.libtaos.taos_errno(self._result)
if errno != 0: if errno != 0:
raise ProgrammingError(CTaosInterface.errStr(self._result), errno) raise ProgrammingError(
if num_of_fields == 0: break CTaosInterface.errStr(
self._result), errno)
if num_of_fields == 0:
break
self._rowcount += num_of_fields self._rowcount += num_of_fields
for i in range(len(self._fields)): for i in range(len(self._fields)):
buffer[i].extend(block[i]) buffer[i].extend(block[i])
return list(map(tuple, zip(*buffer))) return list(map(tuple, zip(*buffer)))
def nextset(self): def nextset(self):
""" """
""" """
...@@ -259,8 +283,8 @@ class TDengineCursor(object): ...@@ -259,8 +283,8 @@ class TDengineCursor(object):
# if threading.get_ident() != self._threadId: # if threading.get_ident() != self._threadId:
# info = "Cursor handleresult:Thread ID not match,creater:"+str(self._threadId)+" caller:"+str(threading.get_ident()) # info = "Cursor handleresult:Thread ID not match,creater:"+str(self._threadId)+" caller:"+str(threading.get_ident())
# raise OperationalError(info) # raise OperationalError(info)
# print(info) # print(info)
# return None # return None
self._description = [] self._description = []
for ele in self._fields: for ele in self._fields:
...@@ -268,4 +292,3 @@ class TDengineCursor(object): ...@@ -268,4 +292,3 @@ class TDengineCursor(object):
(ele['name'], ele['type'], None, None, None, None, False)) (ele['name'], ele['type'], None, None, None, None, False))
return self._result return self._result
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
import time import time
import datetime import datetime
class DBAPITypeObject(object): class DBAPITypeObject(object):
def __init__(self, *values): def __init__(self, *values):
self.values = values self.values = values
...@@ -16,23 +17,28 @@ class DBAPITypeObject(object): ...@@ -16,23 +17,28 @@ class DBAPITypeObject(object):
else: else:
return -1 return -1
Date = datetime.date Date = datetime.date
Time = datetime.time Time = datetime.time
Timestamp = datetime.datetime Timestamp = datetime.datetime
def DataFromTicks(ticks): def DataFromTicks(ticks):
return Date(*time.localtime(ticks)[:3]) return Date(*time.localtime(ticks)[:3])
def TimeFromTicks(ticks): def TimeFromTicks(ticks):
return Time(*time.localtime(ticks)[3:6]) return Time(*time.localtime(ticks)[3:6])
def TimestampFromTicks(ticks): def TimestampFromTicks(ticks):
return Timestamp(*time.localtime(ticks)[:6]) return Timestamp(*time.localtime(ticks)[:6])
Binary = bytes Binary = bytes
# STRING = DBAPITypeObject(*constants.FieldType.get_string_types()) # STRING = DBAPITypeObject(*constants.FieldType.get_string_types())
# BINARY = DBAPITypeObject(*constants.FieldType.get_binary_types()) # BINARY = DBAPITypeObject(*constants.FieldType.get_binary_types())
# NUMBER = BAPITypeObject(*constants.FieldType.get_number_types()) # NUMBER = BAPITypeObject(*constants.FieldType.get_number_types())
# DATETIME = DBAPITypeObject(*constants.FieldType.get_timestamp_types()) # DATETIME = DBAPITypeObject(*constants.FieldType.get_timestamp_types())
# ROWID = DBAPITypeObject() # ROWID = DBAPITypeObject()
\ No newline at end of file
"""Python exceptions """Python exceptions
""" """
class Error(Exception): class Error(Exception):
def __init__(self, msg=None, errno=None): def __init__(self, msg=None, errno=None):
self.msg = msg self.msg = msg
self._full_msg = self.msg self._full_msg = self.msg
self.errno = errno self.errno = errno
def __str__(self): def __str__(self):
return self._full_msg return self._full_msg
class Warning(Exception): class Warning(Exception):
"""Exception raised for important warnings like data truncations while inserting. """Exception raised for important warnings like data truncations while inserting.
""" """
pass pass
class InterfaceError(Error): class InterfaceError(Error):
"""Exception raised for errors that are related to the database interface rather than the database itself. """Exception raised for errors that are related to the database interface rather than the database itself.
""" """
pass pass
class DatabaseError(Error): class DatabaseError(Error):
"""Exception raised for errors that are related to the database. """Exception raised for errors that are related to the database.
""" """
pass pass
class DataError(DatabaseError): class DataError(DatabaseError):
"""Exception raised for errors that are due to problems with the processed data like division by zero, numeric value out of range. """Exception raised for errors that are due to problems with the processed data like division by zero, numeric value out of range.
""" """
pass pass
class OperationalError(DatabaseError): class OperationalError(DatabaseError):
"""Exception raised for errors that are related to the database's operation and not necessarily under the control of the programmer """Exception raised for errors that are related to the database's operation and not necessarily under the control of the programmer
""" """
...@@ -41,17 +47,20 @@ class IntegrityError(DatabaseError): ...@@ -41,17 +47,20 @@ class IntegrityError(DatabaseError):
""" """
pass pass
class InternalError(DatabaseError): class InternalError(DatabaseError):
"""Exception raised when the database encounters an internal error. """Exception raised when the database encounters an internal error.
""" """
pass pass
class ProgrammingError(DatabaseError): class ProgrammingError(DatabaseError):
"""Exception raised for programming errors. """Exception raised for programming errors.
""" """
pass pass
class NotSupportedError(DatabaseError): class NotSupportedError(DatabaseError):
"""Exception raised in case a method or database API was used which is not supported by the database,. """Exception raised in case a method or database API was used which is not supported by the database,.
""" """
pass pass
\ No newline at end of file
from .cinterface import CTaosInterface from .cinterface import CTaosInterface
from .error import * from .error import *
class TDengineSubscription(object): class TDengineSubscription(object):
"""TDengine subscription object """TDengine subscription object
""" """
def __init__(self, sub): def __init__(self, sub):
self._sub = sub self._sub = sub
def consume(self): def consume(self):
"""Consume rows of a subscription """Consume rows of a subscription
""" """
if self._sub is None: if self._sub is None:
raise OperationalError("Invalid use of consume") raise OperationalError("Invalid use of consume")
result, fields = CTaosInterface.consume(self._sub) result, fields = CTaosInterface.consume(self._sub)
buffer = [[] for i in range(len(fields))] buffer = [[] for i in range(len(fields))]
while True: while True:
block, num_of_fields = CTaosInterface.fetchBlock(result, fields) block, num_of_fields = CTaosInterface.fetchBlock(result, fields)
if num_of_fields == 0: break if num_of_fields == 0:
break
for i in range(len(fields)): for i in range(len(fields)):
buffer[i].extend(block[i]) buffer[i].extend(block[i])
self.fields = fields self.fields = fields
return list(map(tuple, zip(*buffer))) return list(map(tuple, zip(*buffer)))
def close(self, keepProgress=True):
def close(self, keepProgress = True):
"""Close the Subscription. """Close the Subscription.
""" """
if self._sub is None: if self._sub is None:
...@@ -38,15 +39,19 @@ class TDengineSubscription(object): ...@@ -38,15 +39,19 @@ class TDengineSubscription(object):
if __name__ == '__main__': if __name__ == '__main__':
from .connection import TDengineConnection from .connection import TDengineConnection
conn = TDengineConnection(host="127.0.0.1", user="root", password="taosdata", database="test") conn = TDengineConnection(
host="127.0.0.1",
user="root",
password="taosdata",
database="test")
# Generate a cursor object to run SQL commands # Generate a cursor object to run SQL commands
sub = conn.subscribe(True, "test", "select * from meters;", 1000) sub = conn.subscribe(True, "test", "select * from meters;", 1000)
for i in range(0,10): for i in range(0, 10):
data = sub.consume() data = sub.consume()
for d in data: for d in data:
print(d) print(d)
sub.close() sub.close()
conn.close() conn.close()
\ No newline at end of file
...@@ -3,7 +3,6 @@ from .connection import TDengineConnection ...@@ -3,7 +3,6 @@ from .connection import TDengineConnection
from .cursor import TDengineCursor from .cursor import TDengineCursor
# Globals # Globals
apilevel = '2.0.3'
threadsafety = 0 threadsafety = 0
paramstyle = 'pyformat' paramstyle = 'pyformat'
...@@ -21,4 +20,4 @@ def connect(*args, **kwargs): ...@@ -21,4 +20,4 @@ def connect(*args, **kwargs):
@rtype: TDengineConnector @rtype: TDengineConnector
""" """
return TDengineConnection(*args, **kwargs) return TDengineConnection(*args, **kwargs)
\ No newline at end of file
...@@ -3,7 +3,6 @@ from .connection import TDengineConnection ...@@ -3,7 +3,6 @@ from .connection import TDengineConnection
from .cursor import TDengineCursor from .cursor import TDengineCursor
# Globals # Globals
apilevel = '2.0.3'
threadsafety = 0 threadsafety = 0
paramstyle = 'pyformat' paramstyle = 'pyformat'
...@@ -21,4 +20,4 @@ def connect(*args, **kwargs): ...@@ -21,4 +20,4 @@ def connect(*args, **kwargs):
@rtype: TDengineConnector @rtype: TDengineConnector
""" """
return TDengineConnection(*args, **kwargs) return TDengineConnection(*args, **kwargs)
\ No newline at end of file
...@@ -68,7 +68,7 @@ typedef struct taosField { ...@@ -68,7 +68,7 @@ typedef struct taosField {
#define DLL_EXPORT #define DLL_EXPORT
#endif #endif
DLL_EXPORT void taos_init(); DLL_EXPORT int taos_init();
DLL_EXPORT void taos_cleanup(void); DLL_EXPORT void taos_cleanup(void);
DLL_EXPORT int taos_options(TSDB_OPTION option, const void *arg, ...); DLL_EXPORT int taos_options(TSDB_OPTION option, const void *arg, ...);
DLL_EXPORT TAOS *taos_connect(const char *ip, const char *user, const char *pass, const char *db, uint16_t port); DLL_EXPORT TAOS *taos_connect(const char *ip, const char *user, const char *pass, const char *db, uint16_t port);
......
...@@ -122,8 +122,8 @@ ...@@ -122,8 +122,8 @@
#define TK_UNSIGNED 103 #define TK_UNSIGNED 103
#define TK_TAGS 104 #define TK_TAGS 104
#define TK_USING 105 #define TK_USING 105
#define TK_AS 106 #define TK_COMMA 106
#define TK_COMMA 107 #define TK_AS 107
#define TK_NULL 108 #define TK_NULL 108
#define TK_SELECT 109 #define TK_SELECT 109
#define TK_UNION 110 #define TK_UNION 110
...@@ -228,6 +228,7 @@ ...@@ -228,6 +228,7 @@
#define TK_VALUES 209 #define TK_VALUES 209
#define TK_SPACE 300 #define TK_SPACE 300
#define TK_COMMENT 301 #define TK_COMMENT 301
#define TK_ILLEGAL 302 #define TK_ILLEGAL 302
......
...@@ -76,7 +76,11 @@ TAOS *shellInit(SShellArguments *args) { ...@@ -76,7 +76,11 @@ TAOS *shellInit(SShellArguments *args) {
args->user = TSDB_DEFAULT_USER; args->user = TSDB_DEFAULT_USER;
} }
taos_init(); if (taos_init()) {
printf("failed to init taos\n");
fflush(stdout);
return NULL;
}
// Connect to the database. // Connect to the database.
TAOS *con = NULL; TAOS *con = NULL;
......
...@@ -110,7 +110,10 @@ int main(int argc, char* argv[]) { ...@@ -110,7 +110,10 @@ int main(int argc, char* argv[]) {
} }
if (args.netTestRole && args.netTestRole[0] != 0) { if (args.netTestRole && args.netTestRole[0] != 0) {
taos_init(); if (taos_init()) {
printf("Failed to init taos");
exit(EXIT_FAILURE);
}
taosNetTest(args.netTestRole, args.host, args.port, args.pktLen); taosNetTest(args.netTestRole, args.host, args.port, args.pktLen);
exit(0); exit(0);
} }
......
...@@ -711,7 +711,11 @@ int main(int argc, char *argv[]) { ...@@ -711,7 +711,11 @@ int main(int argc, char *argv[]) {
fprintf(fp, "###################################################################\n\n"); fprintf(fp, "###################################################################\n\n");
fprintf(fp, "| WRecords | Records/Second | Requests/Second | WLatency(ms) |\n"); fprintf(fp, "| WRecords | Records/Second | Requests/Second | WLatency(ms) |\n");
taos_init(); if (taos_init()) {
fprintf(stderr, "Failed to init taos\n");
return 1;
}
TAOS *taos = taos_connect(ip_addr, user, pass, NULL, port); TAOS *taos = taos_connect(ip_addr, user, pass, NULL, port);
if (taos == NULL) { if (taos == NULL) {
fprintf(stderr, "Failed to connect to TDengine, reason:%s\n", taos_errstr(NULL)); fprintf(stderr, "Failed to connect to TDengine, reason:%s\n", taos_errstr(NULL));
......
...@@ -1971,7 +1971,11 @@ static int createSuperTable(TAOS * taos, char* dbName, SSuperTable* superTbls, ...@@ -1971,7 +1971,11 @@ static int createSuperTable(TAOS * taos, char* dbName, SSuperTable* superTbls,
static int createDatabases() { static int createDatabases() {
TAOS * taos = NULL; TAOS * taos = NULL;
int ret = 0; int ret = 0;
taos_init(); if (taos_init()) {
fprintf(stderr, "Failed to init taos\n");
exit(-1);
}
taos = taos_connect(g_Dbs.host, g_Dbs.user, g_Dbs.password, NULL, g_Dbs.port); taos = taos_connect(g_Dbs.host, g_Dbs.user, g_Dbs.password, NULL, g_Dbs.port);
if (taos == NULL) { if (taos == NULL) {
fprintf(stderr, "Failed to connect to TDengine, reason:%s\n", taos_errstr(NULL)); fprintf(stderr, "Failed to connect to TDengine, reason:%s\n", taos_errstr(NULL));
...@@ -4496,7 +4500,11 @@ void *subQueryProcess(void *sarg) { ...@@ -4496,7 +4500,11 @@ void *subQueryProcess(void *sarg) {
int queryTestProcess() { int queryTestProcess() {
TAOS * taos = NULL; TAOS * taos = NULL;
taos_init(); if (taos_init()) {
fprintf(stderr, "Failed to init taos\n");
exit(-1);
}
taos = taos_connect(g_queryInfo.host, g_queryInfo.user, g_queryInfo.password, NULL, g_queryInfo.port); taos = taos_connect(g_queryInfo.host, g_queryInfo.user, g_queryInfo.password, NULL, g_queryInfo.port);
if (taos == NULL) { if (taos == NULL) {
fprintf(stderr, "Failed to connect to TDengine, reason:%s\n", taos_errstr(NULL)); fprintf(stderr, "Failed to connect to TDengine, reason:%s\n", taos_errstr(NULL));
...@@ -4772,7 +4780,11 @@ int subscribeTestProcess() { ...@@ -4772,7 +4780,11 @@ int subscribeTestProcess() {
} }
TAOS * taos = NULL; TAOS * taos = NULL;
taos_init(); if (taos_init()) {
fprintf(stderr, "Failed to init taos\n");
exit(-1);
}
taos = taos_connect(g_queryInfo.host, g_queryInfo.user, g_queryInfo.password, g_queryInfo.dbName, g_queryInfo.port); taos = taos_connect(g_queryInfo.host, g_queryInfo.user, g_queryInfo.password, g_queryInfo.dbName, g_queryInfo.port);
if (taos == NULL) { if (taos == NULL) {
fprintf(stderr, "Failed to connect to TDengine, reason:%s\n", taos_errstr(NULL)); fprintf(stderr, "Failed to connect to TDengine, reason:%s\n", taos_errstr(NULL));
......
...@@ -103,7 +103,9 @@ int32_t monInitSystem() { ...@@ -103,7 +103,9 @@ int32_t monInitSystem() {
} }
int32_t monStartSystem() { int32_t monStartSystem() {
taos_init(); if (taos_init()) {
return -1;
}
tsMonitor.start = 1; tsMonitor.start = 1;
monExecuteSQLFp = monExecuteSQL; monExecuteSQLFp = monExecuteSQL;
monInfo("monitor module start"); monInfo("monitor module start");
......
...@@ -76,6 +76,7 @@ typedef struct SQuerySQL { ...@@ -76,6 +76,7 @@ typedef struct SQuerySQL {
typedef struct SCreatedTableInfo { typedef struct SCreatedTableInfo {
SStrToken name; // table name token SStrToken name; // table name token
SStrToken stableName; // super table name token , for using clause SStrToken stableName; // super table name token , for using clause
SArray *pTagNames; // create by using super table, tag name
SArray *pTagVals; // create by using super table, tag value SArray *pTagVals; // create by using super table, tag value
char *fullname; // table full name char *fullname; // table full name
STagData tagdata; // true tag data, super table full name is in STagData STagData tagdata; // true tag data, super table full name is in STagData
...@@ -246,7 +247,7 @@ SCreateTableSQL *tSetCreateSqlElems(SArray *pCols, SArray *pTags, SQuerySQL *pSe ...@@ -246,7 +247,7 @@ SCreateTableSQL *tSetCreateSqlElems(SArray *pCols, SArray *pTags, SQuerySQL *pSe
void tSqlExprNodeDestroy(tSQLExpr *pExpr); void tSqlExprNodeDestroy(tSQLExpr *pExpr);
SAlterTableInfo * tAlterTableSqlElems(SStrToken *pTableName, SArray *pCols, SArray *pVals, int32_t type, int16_t tableTable); SAlterTableInfo * tAlterTableSqlElems(SStrToken *pTableName, SArray *pCols, SArray *pVals, int32_t type, int16_t tableTable);
SCreatedTableInfo createNewChildTableInfo(SStrToken *pTableName, SArray *pTagVals, SStrToken *pToken, SStrToken* igExists); SCreatedTableInfo createNewChildTableInfo(SStrToken *pTableName, SArray *pTagNames, SArray *pTagVals, SStrToken *pToken, SStrToken* igExists);
void destroyAllSelectClause(SSubclauseInfo *pSql); void destroyAllSelectClause(SSubclauseInfo *pSql);
void doDestroyQuerySql(SQuerySQL *pSql); void doDestroyQuerySql(SQuerySQL *pSql);
......
...@@ -356,9 +356,20 @@ create_stable_args(A) ::= ifnotexists(U) ids(V) cpxName(Z) LP columnlist(X) RP T ...@@ -356,9 +356,20 @@ create_stable_args(A) ::= ifnotexists(U) ids(V) cpxName(Z) LP columnlist(X) RP T
create_from_stable(A) ::= ifnotexists(U) ids(V) cpxName(Z) USING ids(X) cpxName(F) TAGS LP tagitemlist(Y) RP. { create_from_stable(A) ::= ifnotexists(U) ids(V) cpxName(Z) USING ids(X) cpxName(F) TAGS LP tagitemlist(Y) RP. {
X.n += F.n; X.n += F.n;
V.n += Z.n; V.n += Z.n;
A = createNewChildTableInfo(&X, Y, &V, &U); A = createNewChildTableInfo(&X, NULL, Y, &V, &U);
} }
create_from_stable(A) ::= ifnotexists(U) ids(V) cpxName(Z) USING ids(X) cpxName(F) LP tagNamelist(P) RP TAGS LP tagitemlist(Y) RP. {
X.n += F.n;
V.n += Z.n;
A = createNewChildTableInfo(&X, P, Y, &V, &U);
}
%type tagNamelist{SArray*}
%destructor tagNamelist {taosArrayDestroy($$);}
tagNamelist(A) ::= tagNamelist(X) COMMA ids(Y). {taosArrayPush(X, &Y); A = X; }
tagNamelist(A) ::= ids(X). {A = taosArrayInit(4, sizeof(SStrToken)); taosArrayPush(A, &X);}
// create stream // create stream
// create table table_name as select count(*) from super_table_name interval(time) // 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). { create_table_args(A) ::= ifnotexists(U) ids(V) cpxName(Z) AS select(S). {
......
...@@ -2574,12 +2574,16 @@ static void bottom_function(SQLFunctionCtx *pCtx) { ...@@ -2574,12 +2574,16 @@ static void bottom_function(SQLFunctionCtx *pCtx) {
STopBotInfo *pRes = getTopBotOutputInfo(pCtx); STopBotInfo *pRes = getTopBotOutputInfo(pCtx);
if ((void *)pRes->res[0] != (void *)((char *)pRes + sizeof(STopBotInfo) + POINTER_BYTES * pCtx->param[0].i64)) {
buildTopBotStruct(pRes, pCtx);
}
for (int32_t i = 0; i < pCtx->size; ++i) { for (int32_t i = 0; i < pCtx->size; ++i) {
char *data = GET_INPUT_DATA(pCtx, i); char *data = GET_INPUT_DATA(pCtx, i);
TSKEY ts = GET_TS_DATA(pCtx, i); TSKEY ts = GET_TS_DATA(pCtx, i);
if (pCtx->hasNull && isNull(data, pCtx->inputType)) { if (pCtx->hasNull && isNull(data, pCtx->inputType)) {
continue; continue;
} }
notNullElems++; notNullElems++;
...@@ -2608,6 +2612,11 @@ static void bottom_function_f(SQLFunctionCtx *pCtx, int32_t index) { ...@@ -2608,6 +2612,11 @@ static void bottom_function_f(SQLFunctionCtx *pCtx, int32_t index) {
} }
STopBotInfo *pRes = getTopBotOutputInfo(pCtx); STopBotInfo *pRes = getTopBotOutputInfo(pCtx);
if ((void *)pRes->res[0] != (void *)((char *)pRes + sizeof(STopBotInfo) + POINTER_BYTES * pCtx->param[0].i64)) {
buildTopBotStruct(pRes, pCtx);
}
SET_VAL(pCtx, 1, 1); SET_VAL(pCtx, 1, 1);
do_bottom_function_add(pRes, (int32_t)pCtx->param[0].i64, pData, ts, pCtx->inputType, &pCtx->tagInfo, NULL, 0); do_bottom_function_add(pRes, (int32_t)pCtx->param[0].i64, pData, ts, pCtx->inputType, &pCtx->tagInfo, NULL, 0);
......
...@@ -3785,7 +3785,7 @@ void setResultRowOutputBufInitCtx(SQueryRuntimeEnv *pRuntimeEnv, SResultRow *pRe ...@@ -3785,7 +3785,7 @@ void setResultRowOutputBufInitCtx(SQueryRuntimeEnv *pRuntimeEnv, SResultRow *pRe
if (functionId == TSDB_FUNC_TOP || functionId == TSDB_FUNC_BOTTOM || functionId == TSDB_FUNC_DIFF) { if (functionId == TSDB_FUNC_TOP || functionId == TSDB_FUNC_BOTTOM || functionId == TSDB_FUNC_DIFF) {
pCtx->ptsOutputBuf = pRuntimeEnv->pCtx[0].pOutput; pCtx->ptsOutputBuf = pRuntimeEnv->pCtx[0].pOutput;
} }
if (!pCtx->resultInfo->initialized) { if (!pCtx->resultInfo->initialized) {
aAggs[functionId].init(pCtx); aAggs[functionId].init(pCtx);
} }
......
...@@ -496,7 +496,8 @@ static void freeVariant(void *pItem) { ...@@ -496,7 +496,8 @@ static void freeVariant(void *pItem) {
} }
void freeCreateTableInfo(void* p) { void freeCreateTableInfo(void* p) {
SCreatedTableInfo* pInfo = (SCreatedTableInfo*) p; SCreatedTableInfo* pInfo = (SCreatedTableInfo*) p;
taosArrayDestroy(pInfo->pTagNames);
taosArrayDestroyEx(pInfo->pTagVals, freeVariant); taosArrayDestroyEx(pInfo->pTagVals, freeVariant);
tfree(pInfo->fullname); tfree(pInfo->fullname);
tfree(pInfo->tagdata.data); tfree(pInfo->tagdata.data);
...@@ -574,11 +575,12 @@ SCreateTableSQL *tSetCreateSqlElems(SArray *pCols, SArray *pTags, SQuerySQL *pSe ...@@ -574,11 +575,12 @@ SCreateTableSQL *tSetCreateSqlElems(SArray *pCols, SArray *pTags, SQuerySQL *pSe
return pCreate; return pCreate;
} }
SCreatedTableInfo createNewChildTableInfo(SStrToken *pTableName, SArray *pTagVals, SStrToken *pToken, SStrToken* igExists) { SCreatedTableInfo createNewChildTableInfo(SStrToken *pTableName, SArray *pTagNames, SArray *pTagVals, SStrToken *pToken, SStrToken* igExists) {
SCreatedTableInfo info; SCreatedTableInfo info;
memset(&info, 0, sizeof(SCreatedTableInfo)); memset(&info, 0, sizeof(SCreatedTableInfo));
info.name = *pToken; info.name = *pToken;
info.pTagNames = pTagNames;
info.pTagVals = pTagVals; info.pTagVals = pTagVals;
info.stableName = *pTableName; info.stableName = *pTableName;
info.igExist = (igExists->n > 0)? 1:0; info.igExist = (igExists->n > 0)? 1:0;
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
** input grammar file: ** input grammar file:
*/ */
#include <stdio.h> #include <stdio.h>
#include <assert.h>
/************ Begin %include sections from the grammar ************************/ /************ Begin %include sections from the grammar ************************/
#include <stdio.h> #include <stdio.h>
...@@ -76,8 +77,10 @@ ...@@ -76,8 +77,10 @@
** zero the stack is dynamically sized using realloc() ** zero the stack is dynamically sized using realloc()
** ParseARG_SDECL A static variable declaration for the %extra_argument ** ParseARG_SDECL A static variable declaration for the %extra_argument
** ParseARG_PDECL A parameter declaration for the %extra_argument ** ParseARG_PDECL A parameter declaration for the %extra_argument
** ParseARG_PARAM Code to pass %extra_argument as a subroutine parameter
** ParseARG_STORE Code to store %extra_argument into yypParser ** ParseARG_STORE Code to store %extra_argument into yypParser
** ParseARG_FETCH Code to extract %extra_argument from yypParser ** ParseARG_FETCH Code to extract %extra_argument from yypParser
** ParseCTX_* As ParseARG_ except for %extra_context
** YYERRORSYMBOL is the code number of the error symbol. If not ** YYERRORSYMBOL is the code number of the error symbol. If not
** defined, then do no error processing. ** defined, then do no error processing.
** YYNSTATE the combined number of states. ** YYNSTATE the combined number of states.
...@@ -97,7 +100,7 @@ ...@@ -97,7 +100,7 @@
#endif #endif
/************* Begin control #defines *****************************************/ /************* Begin control #defines *****************************************/
#define YYCODETYPE unsigned short int #define YYCODETYPE unsigned short int
#define YYNOCODE 282 #define YYNOCODE 281
#define YYACTIONTYPE unsigned short int #define YYACTIONTYPE unsigned short int
#define ParseTOKENTYPE SStrToken #define ParseTOKENTYPE SStrToken
typedef union { typedef union {
...@@ -124,21 +127,29 @@ typedef union { ...@@ -124,21 +127,29 @@ typedef union {
#endif #endif
#define ParseARG_SDECL SSqlInfo* pInfo; #define ParseARG_SDECL SSqlInfo* pInfo;
#define ParseARG_PDECL ,SSqlInfo* pInfo #define ParseARG_PDECL ,SSqlInfo* pInfo
#define ParseARG_FETCH SSqlInfo* pInfo = yypParser->pInfo #define ParseARG_PARAM ,pInfo
#define ParseARG_STORE yypParser->pInfo = pInfo #define ParseARG_FETCH SSqlInfo* pInfo=yypParser->pInfo;
#define ParseARG_STORE yypParser->pInfo=pInfo;
#define ParseCTX_SDECL
#define ParseCTX_PDECL
#define ParseCTX_PARAM
#define ParseCTX_FETCH
#define ParseCTX_STORE
#define YYFALLBACK 1 #define YYFALLBACK 1
#define YYNSTATE 283 #define YYNSTATE 290
#define YYNRULE 250 #define YYNRULE 253
#define YYNRULE_WITH_ACTION 253
#define YYNTOKEN 210 #define YYNTOKEN 210
#define YY_MAX_SHIFT 282 #define YY_MAX_SHIFT 289
#define YY_MIN_SHIFTREDUCE 463 #define YY_MIN_SHIFTREDUCE 473
#define YY_MAX_SHIFTREDUCE 712 #define YY_MAX_SHIFTREDUCE 725
#define YY_ERROR_ACTION 713 #define YY_ERROR_ACTION 726
#define YY_ACCEPT_ACTION 714 #define YY_ACCEPT_ACTION 727
#define YY_NO_ACTION 715 #define YY_NO_ACTION 728
#define YY_MIN_REDUCE 716 #define YY_MIN_REDUCE 729
#define YY_MAX_REDUCE 965 #define YY_MAX_REDUCE 981
/************* End control #defines *******************************************/ /************* End control #defines *******************************************/
#define YY_NLOOKAHEAD ((int)(sizeof(yy_lookahead)/sizeof(yy_lookahead[0])))
/* Define the yytestcase() macro to be a no-op if is not already defined /* Define the yytestcase() macro to be a no-op if is not already defined
** otherwise. ** otherwise.
...@@ -203,135 +214,136 @@ typedef union { ...@@ -203,135 +214,136 @@ typedef union {
** yy_default[] Default action for each state. ** yy_default[] Default action for each state.
** **
*********** Begin parsing tables **********************************************/ *********** Begin parsing tables **********************************************/
#define YY_ACTTAB_COUNT (615) #define YY_ACTTAB_COUNT (627)
static const YYACTIONTYPE yy_action[] = { static const YYACTIONTYPE yy_action[] = {
/* 0 */ 872, 507, 159, 714, 282, 159, 15, 580, 183, 508, /* 0 */ 888, 517, 727, 289, 517, 182, 287, 590, 28, 518,
/* 10 */ 663, 186, 948, 41, 42, 947, 43, 44, 26, 158, /* 10 */ 15, 161, 518, 43, 44, 771, 45, 46, 150, 162,
/* 20 */ 191, 35, 507, 507, 232, 47, 45, 49, 46, 163, /* 20 */ 194, 37, 126, 517, 238, 49, 47, 51, 48, 963,
/* 30 */ 508, 508, 850, 40, 39, 257, 256, 38, 37, 36, /* 30 */ 166, 518, 186, 42, 41, 264, 263, 40, 39, 38,
/* 40 */ 41, 42, 118, 43, 44, 861, 664, 191, 35, 179, /* 40 */ 43, 44, 877, 45, 46, 877, 184, 194, 37, 863,
/* 50 */ 280, 232, 47, 45, 49, 46, 181, 869, 847, 215, /* 50 */ 121, 238, 49, 47, 51, 48, 183, 866, 885, 221,
/* 60 */ 40, 39, 957, 123, 38, 37, 36, 464, 465, 466, /* 60 */ 42, 41, 126, 126, 40, 39, 38, 474, 475, 476,
/* 70 */ 467, 468, 469, 470, 471, 472, 473, 474, 475, 281, /* 70 */ 477, 478, 479, 480, 481, 482, 483, 484, 485, 288,
/* 80 */ 91, 196, 205, 41, 42, 267, 43, 44, 839, 247, /* 80 */ 43, 44, 211, 45, 46, 916, 254, 194, 37, 162,
/* 90 */ 191, 35, 159, 944, 232, 47, 45, 49, 46, 123, /* 90 */ 630, 238, 49, 47, 51, 48, 71, 94, 189, 964,
/* 100 */ 220, 185, 948, 40, 39, 850, 62, 38, 37, 36, /* 100 */ 42, 41, 274, 960, 40, 39, 38, 64, 65, 226,
/* 110 */ 20, 245, 275, 274, 244, 243, 242, 273, 241, 272, /* 110 */ 21, 252, 282, 281, 251, 250, 249, 280, 248, 279,
/* 120 */ 271, 270, 240, 269, 268, 901, 267, 227, 817, 661, /* 120 */ 278, 277, 247, 276, 275, 917, 70, 233, 830, 674,
/* 130 */ 805, 806, 807, 808, 809, 810, 811, 812, 813, 814, /* 130 */ 818, 819, 820, 821, 822, 823, 824, 825, 826, 827,
/* 140 */ 815, 816, 818, 819, 42, 208, 43, 44, 642, 643, /* 140 */ 828, 829, 831, 832, 44, 199, 45, 46, 274, 28,
/* 150 */ 191, 35, 212, 211, 232, 47, 45, 49, 46, 229, /* 150 */ 194, 37, 162, 959, 238, 49, 47, 51, 48, 860,
/* 160 */ 861, 67, 21, 40, 39, 247, 276, 38, 37, 36, /* 160 */ 201, 188, 964, 42, 41, 634, 214, 40, 39, 38,
/* 170 */ 32, 43, 44, 197, 180, 191, 35, 849, 70, 232, /* 170 */ 866, 45, 46, 218, 217, 194, 37, 958, 72, 238,
/* 180 */ 47, 45, 49, 46, 16, 38, 37, 36, 40, 39, /* 180 */ 49, 47, 51, 48, 16, 866, 205, 197, 42, 41,
/* 190 */ 850, 123, 38, 37, 36, 190, 674, 72, 26, 665, /* 190 */ 863, 283, 40, 39, 38, 193, 687, 22, 200, 678,
/* 200 */ 167, 668, 667, 671, 670, 61, 168, 836, 837, 25, /* 200 */ 170, 681, 203, 684, 178, 34, 171, 849, 850, 27,
/* 210 */ 840, 103, 102, 166, 190, 674, 758, 199, 665, 147, /* 210 */ 853, 106, 105, 169, 193, 687, 866, 179, 678, 75,
/* 220 */ 668, 767, 671, 20, 147, 275, 274, 187, 188, 841, /* 220 */ 681, 780, 684, 21, 150, 282, 281, 190, 191, 164,
/* 230 */ 273, 231, 272, 271, 270, 838, 269, 268, 846, 198, /* 230 */ 280, 237, 279, 278, 277, 614, 276, 275, 611, 10,
/* 240 */ 823, 21, 249, 821, 822, 943, 187, 188, 824, 32, /* 240 */ 612, 22, 613, 74, 165, 136, 190, 191, 63, 34,
/* 250 */ 826, 827, 825, 900, 828, 829, 123, 3, 137, 47, /* 250 */ 836, 854, 207, 834, 835, 261, 260, 167, 837, 852,
/* 260 */ 45, 49, 46, 29, 78, 74, 77, 40, 39, 617, /* 260 */ 839, 840, 838, 126, 841, 842, 208, 209, 204, 168,
/* 270 */ 214, 38, 37, 36, 233, 601, 759, 174, 598, 147, /* 270 */ 220, 256, 49, 47, 51, 48, 28, 177, 851, 927,
/* 280 */ 599, 26, 600, 201, 89, 93, 254, 253, 26, 942, /* 280 */ 42, 41, 92, 96, 40, 39, 38, 28, 86, 101,
/* 290 */ 83, 98, 101, 92, 26, 48, 153, 149, 26, 95, /* 290 */ 104, 95, 3, 140, 28, 50, 28, 98, 31, 81,
/* 300 */ 175, 26, 151, 106, 105, 104, 202, 203, 673, 26, /* 300 */ 77, 80, 28, 156, 152, 119, 28, 206, 686, 154,
/* 310 */ 69, 40, 39, 200, 48, 38, 37, 36, 68, 194, /* 310 */ 109, 108, 107, 34, 50, 42, 41, 862, 224, 40,
/* 320 */ 10, 847, 63, 672, 71, 133, 195, 673, 847, 279, /* 320 */ 39, 38, 29, 685, 235, 198, 69, 686, 863, 40,
/* 330 */ 278, 110, 250, 666, 847, 669, 251, 614, 847, 255, /* 330 */ 39, 38, 257, 192, 258, 863, 254, 863, 676, 864,
/* 340 */ 116, 847, 672, 22, 621, 848, 609, 259, 32, 847, /* 340 */ 262, 615, 685, 863, 266, 655, 656, 863, 286, 285,
/* 350 */ 218, 629, 633, 634, 217, 27, 120, 52, 18, 693, /* 350 */ 113, 772, 627, 622, 150, 680, 642, 683, 646, 23,
/* 360 */ 675, 189, 53, 176, 17, 17, 590, 677, 56, 235, /* 360 */ 123, 223, 54, 647, 706, 688, 239, 18, 17, 17,
/* 370 */ 591, 27, 100, 99, 27, 52, 82, 81, 12, 11, /* 370 */ 679, 55, 682, 26, 677, 4, 244, 58, 600, 241,
/* 380 */ 161, 602, 54, 59, 162, 579, 57, 88, 87, 14, /* 380 */ 602, 243, 29, 29, 54, 73, 601, 174, 85, 84,
/* 390 */ 13, 605, 603, 606, 604, 115, 113, 164, 165, 171, /* 390 */ 54, 175, 56, 12, 11, 173, 59, 91, 90, 61,
/* 400 */ 911, 172, 170, 4, 157, 169, 160, 910, 192, 907, /* 400 */ 973, 589, 14, 13, 618, 616, 619, 617, 103, 102,
/* 410 */ 906, 193, 258, 117, 871, 33, 878, 880, 119, 863, /* 410 */ 118, 116, 160, 172, 163, 865, 926, 195, 923, 922,
/* 420 */ 893, 892, 134, 135, 132, 136, 769, 32, 239, 155, /* 420 */ 196, 265, 879, 120, 887, 35, 909, 894, 896, 908,
/* 430 */ 30, 248, 766, 216, 962, 79, 961, 114, 959, 138, /* 430 */ 122, 137, 859, 135, 34, 138, 139, 782, 222, 246,
/* 440 */ 252, 956, 85, 955, 628, 953, 221, 139, 182, 225, /* 440 */ 158, 32, 255, 779, 117, 978, 641, 82, 977, 975,
/* 450 */ 787, 31, 28, 58, 156, 756, 94, 860, 55, 50, /* 450 */ 141, 259, 972, 88, 971, 227, 969, 142, 800, 690,
/* 460 */ 754, 96, 230, 124, 228, 125, 97, 752, 126, 127, /* 460 */ 185, 33, 30, 159, 231, 769, 97, 60, 876, 128,
/* 470 */ 226, 128, 224, 222, 751, 34, 204, 148, 90, 749, /* 470 */ 767, 99, 57, 127, 236, 52, 234, 232, 230, 100,
/* 480 */ 260, 261, 262, 748, 747, 746, 745, 263, 150, 152, /* 480 */ 765, 764, 130, 210, 228, 36, 151, 93, 762, 267,
/* 490 */ 742, 740, 264, 738, 736, 734, 265, 154, 266, 219, /* 490 */ 268, 269, 270, 761, 760, 271, 759, 272, 273, 758,
/* 500 */ 64, 65, 894, 277, 712, 206, 207, 177, 237, 238, /* 500 */ 153, 155, 755, 753, 751, 284, 749, 747, 157, 725,
/* 510 */ 711, 178, 173, 209, 75, 210, 710, 698, 217, 213, /* 510 */ 225, 66, 212, 67, 910, 213, 724, 215, 216, 723,
/* 520 */ 750, 611, 107, 60, 744, 234, 142, 141, 788, 140, /* 520 */ 180, 202, 711, 245, 219, 181, 176, 223, 78, 624,
/* 530 */ 143, 144, 146, 145, 1, 108, 743, 2, 109, 735, /* 530 */ 62, 763, 6, 240, 110, 111, 68, 757, 145, 643,
/* 540 */ 66, 6, 184, 630, 845, 121, 223, 131, 129, 130, /* 540 */ 144, 801, 143, 146, 147, 149, 148, 756, 1, 124,
/* 550 */ 635, 122, 5, 23, 7, 8, 24, 676, 9, 19, /* 550 */ 112, 187, 748, 229, 125, 2, 648, 861, 7, 8,
/* 560 */ 678, 71, 73, 236, 548, 544, 542, 541, 540, 537, /* 560 */ 689, 24, 133, 131, 129, 132, 134, 25, 5, 9,
/* 570 */ 511, 246, 76, 27, 51, 582, 80, 84, 581, 578, /* 570 */ 691, 19, 20, 242, 76, 558, 554, 74, 552, 551,
/* 580 */ 532, 86, 530, 522, 528, 524, 526, 520, 518, 550, /* 580 */ 550, 547, 253, 521, 83, 29, 79, 592, 53, 591,
/* 590 */ 549, 547, 546, 545, 543, 539, 538, 52, 509, 479, /* 590 */ 87, 89, 588, 542, 540, 532, 538, 534, 536, 530,
/* 600 */ 477, 716, 715, 715, 715, 715, 715, 715, 715, 715, /* 600 */ 528, 560, 559, 557, 556, 555, 553, 549, 548, 54,
/* 610 */ 715, 715, 715, 111, 112, /* 610 */ 519, 489, 487, 729, 728, 728, 728, 728, 728, 728,
/* 620 */ 728, 728, 728, 728, 728, 114, 115,
}; };
static const YYCODETYPE yy_lookahead[] = { static const YYCODETYPE yy_lookahead[] = {
/* 0 */ 214, 1, 270, 211, 212, 270, 270, 5, 231, 9, /* 0 */ 213, 1, 210, 211, 1, 212, 213, 5, 213, 9,
/* 10 */ 1, 279, 280, 13, 14, 280, 16, 17, 214, 270, /* 10 */ 270, 270, 9, 13, 14, 217, 16, 17, 220, 270,
/* 20 */ 20, 21, 1, 1, 24, 25, 26, 27, 28, 270, /* 20 */ 20, 21, 213, 1, 24, 25, 26, 27, 28, 280,
/* 30 */ 9, 9, 255, 33, 34, 33, 34, 37, 38, 39, /* 30 */ 270, 9, 230, 33, 34, 33, 34, 37, 38, 39,
/* 40 */ 13, 14, 214, 16, 17, 253, 37, 20, 21, 213, /* 40 */ 13, 14, 253, 16, 17, 253, 251, 20, 21, 254,
/* 50 */ 214, 24, 25, 26, 27, 28, 252, 271, 254, 267, /* 50 */ 213, 24, 25, 26, 27, 28, 267, 255, 271, 267,
/* 60 */ 33, 34, 255, 214, 37, 38, 39, 45, 46, 47, /* 60 */ 33, 34, 213, 213, 37, 38, 39, 45, 46, 47,
/* 70 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, /* 70 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
/* 80 */ 74, 231, 60, 13, 14, 79, 16, 17, 0, 77, /* 80 */ 13, 14, 60, 16, 17, 276, 77, 20, 21, 270,
/* 90 */ 20, 21, 270, 270, 24, 25, 26, 27, 28, 214, /* 90 */ 37, 24, 25, 26, 27, 28, 256, 74, 279, 280,
/* 100 */ 272, 279, 280, 33, 34, 255, 106, 37, 38, 39, /* 100 */ 33, 34, 79, 270, 37, 38, 39, 107, 268, 272,
/* 110 */ 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, /* 110 */ 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
/* 120 */ 96, 97, 98, 99, 100, 276, 79, 278, 230, 102, /* 120 */ 96, 97, 98, 99, 100, 276, 276, 278, 229, 102,
/* 130 */ 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, /* 130 */ 231, 232, 233, 234, 235, 236, 237, 238, 239, 240,
/* 140 */ 242, 243, 244, 245, 14, 131, 16, 17, 120, 121, /* 140 */ 241, 242, 243, 244, 14, 230, 16, 17, 79, 213,
/* 150 */ 20, 21, 138, 139, 24, 25, 26, 27, 28, 274, /* 150 */ 20, 21, 270, 270, 24, 25, 26, 27, 28, 213,
/* 160 */ 253, 276, 101, 33, 34, 77, 231, 37, 38, 39, /* 160 */ 230, 279, 280, 33, 34, 112, 131, 37, 38, 39,
/* 170 */ 109, 16, 17, 66, 267, 20, 21, 255, 219, 24, /* 170 */ 255, 16, 17, 138, 139, 20, 21, 270, 218, 24,
/* 180 */ 25, 26, 27, 28, 44, 37, 38, 39, 33, 34, /* 180 */ 25, 26, 27, 28, 44, 255, 66, 251, 33, 34,
/* 190 */ 255, 214, 37, 38, 39, 1, 2, 219, 214, 5, /* 190 */ 254, 230, 37, 38, 39, 1, 2, 101, 252, 5,
/* 200 */ 60, 7, 5, 9, 7, 219, 66, 248, 249, 250, /* 200 */ 60, 7, 66, 9, 270, 109, 66, 247, 248, 249,
/* 210 */ 251, 71, 72, 73, 1, 2, 218, 66, 5, 221, /* 210 */ 250, 71, 72, 73, 1, 2, 255, 270, 5, 218,
/* 220 */ 7, 218, 9, 86, 221, 88, 89, 33, 34, 251, /* 220 */ 7, 217, 9, 86, 220, 88, 89, 33, 34, 270,
/* 230 */ 93, 37, 95, 96, 97, 249, 99, 100, 254, 132, /* 230 */ 93, 37, 95, 96, 97, 2, 99, 100, 5, 101,
/* 240 */ 230, 101, 135, 233, 234, 270, 33, 34, 238, 109, /* 240 */ 7, 101, 9, 105, 270, 107, 33, 34, 218, 109,
/* 250 */ 240, 241, 242, 276, 244, 245, 214, 61, 62, 25, /* 250 */ 229, 250, 132, 232, 233, 135, 136, 270, 237, 0,
/* 260 */ 26, 27, 28, 67, 68, 69, 70, 33, 34, 37, /* 260 */ 239, 240, 241, 213, 243, 244, 33, 34, 132, 270,
/* 270 */ 130, 37, 38, 39, 15, 2, 218, 137, 5, 221, /* 270 */ 130, 135, 25, 26, 27, 28, 213, 137, 248, 246,
/* 280 */ 7, 214, 9, 132, 61, 62, 135, 136, 214, 270, /* 280 */ 33, 34, 61, 62, 37, 38, 39, 213, 67, 68,
/* 290 */ 67, 68, 69, 70, 214, 101, 61, 62, 214, 76, /* 290 */ 69, 70, 61, 62, 213, 101, 213, 76, 67, 68,
/* 300 */ 270, 214, 67, 68, 69, 70, 33, 34, 114, 214, /* 300 */ 69, 70, 213, 61, 62, 101, 213, 213, 114, 67,
/* 310 */ 256, 33, 34, 214, 101, 37, 38, 39, 276, 252, /* 310 */ 68, 69, 70, 109, 101, 33, 34, 254, 102, 37,
/* 320 */ 101, 254, 268, 129, 105, 106, 252, 114, 254, 63, /* 320 */ 38, 39, 106, 129, 274, 251, 276, 114, 254, 37,
/* 330 */ 64, 65, 252, 5, 254, 7, 252, 107, 254, 252, /* 330 */ 38, 39, 251, 59, 251, 254, 77, 254, 1, 245,
/* 340 */ 101, 254, 129, 113, 112, 246, 102, 252, 109, 254, /* 340 */ 251, 108, 129, 254, 251, 120, 121, 254, 63, 64,
/* 350 */ 102, 102, 102, 102, 110, 107, 107, 107, 107, 102, /* 350 */ 65, 217, 106, 102, 220, 5, 102, 7, 102, 113,
/* 360 */ 102, 59, 107, 270, 107, 107, 102, 108, 107, 102, /* 360 */ 106, 110, 106, 102, 102, 102, 15, 106, 106, 106,
/* 370 */ 102, 107, 74, 75, 107, 107, 133, 134, 133, 134, /* 370 */ 5, 106, 7, 101, 37, 101, 104, 106, 102, 102,
/* 380 */ 270, 108, 127, 101, 270, 103, 125, 133, 134, 133, /* 380 */ 102, 102, 106, 106, 106, 106, 102, 270, 133, 134,
/* 390 */ 134, 5, 5, 7, 7, 61, 62, 270, 270, 270, /* 390 */ 106, 270, 127, 133, 134, 270, 125, 133, 134, 101,
/* 400 */ 247, 270, 270, 101, 270, 270, 270, 247, 247, 247, /* 400 */ 255, 103, 133, 134, 5, 5, 7, 7, 74, 75,
/* 410 */ 247, 247, 247, 214, 214, 269, 214, 214, 214, 253, /* 410 */ 61, 62, 270, 270, 270, 255, 246, 246, 246, 246,
/* 420 */ 277, 277, 214, 214, 257, 214, 214, 109, 214, 214, /* 420 */ 246, 246, 253, 213, 213, 269, 277, 213, 213, 277,
/* 430 */ 214, 214, 214, 253, 214, 214, 214, 59, 214, 214, /* 430 */ 213, 213, 213, 257, 109, 213, 213, 213, 253, 213,
/* 440 */ 214, 214, 214, 214, 114, 214, 273, 214, 273, 273, /* 440 */ 213, 213, 213, 213, 59, 213, 114, 213, 213, 213,
/* 450 */ 214, 214, 214, 124, 214, 214, 214, 266, 126, 123, /* 450 */ 213, 213, 213, 213, 213, 273, 213, 213, 213, 108,
/* 460 */ 214, 214, 118, 265, 122, 264, 214, 214, 263, 262, /* 460 */ 273, 213, 213, 213, 273, 213, 213, 124, 266, 264,
/* 470 */ 117, 261, 116, 115, 214, 128, 214, 214, 85, 214, /* 470 */ 213, 213, 126, 265, 118, 123, 122, 117, 116, 213,
/* 480 */ 84, 49, 81, 214, 214, 214, 214, 83, 214, 214, /* 480 */ 213, 213, 262, 213, 115, 128, 213, 85, 213, 84,
/* 490 */ 214, 214, 53, 214, 214, 214, 82, 214, 80, 215, /* 490 */ 49, 81, 83, 213, 213, 53, 213, 82, 80, 213,
/* 500 */ 215, 215, 215, 77, 5, 140, 5, 215, 215, 215, /* 500 */ 213, 213, 213, 213, 213, 77, 213, 213, 213, 5,
/* 510 */ 5, 215, 215, 140, 219, 5, 5, 87, 110, 131, /* 510 */ 214, 214, 140, 214, 214, 5, 5, 140, 5, 5,
/* 520 */ 215, 102, 216, 111, 215, 104, 223, 227, 229, 228, /* 520 */ 214, 214, 87, 214, 131, 214, 214, 110, 218, 102,
/* 530 */ 226, 224, 222, 225, 220, 216, 215, 217, 216, 215, /* 530 */ 111, 214, 101, 104, 215, 215, 106, 214, 222, 102,
/* 540 */ 107, 101, 1, 102, 253, 101, 101, 258, 260, 259, /* 540 */ 226, 228, 227, 225, 223, 221, 224, 214, 219, 101,
/* 550 */ 102, 101, 101, 107, 119, 119, 107, 102, 101, 101, /* 550 */ 215, 1, 214, 101, 101, 216, 102, 253, 119, 119,
/* 560 */ 108, 105, 74, 104, 9, 5, 5, 5, 5, 5, /* 560 */ 102, 106, 259, 261, 263, 260, 258, 106, 101, 101,
/* 570 */ 78, 15, 74, 107, 16, 5, 134, 134, 5, 102, /* 570 */ 108, 101, 101, 104, 74, 9, 5, 105, 5, 5,
/* 580 */ 5, 134, 5, 5, 5, 5, 5, 5, 5, 5, /* 580 */ 5, 5, 15, 78, 134, 106, 74, 5, 16, 5,
/* 590 */ 5, 5, 5, 5, 5, 5, 5, 107, 78, 59, /* 590 */ 134, 134, 102, 5, 5, 5, 5, 5, 5, 5,
/* 600 */ 58, 0, 281, 281, 281, 281, 281, 281, 281, 281, /* 600 */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 106,
/* 610 */ 281, 281, 281, 21, 21, 281, 281, 281, 281, 281, /* 610 */ 78, 59, 58, 0, 281, 281, 281, 281, 281, 281,
/* 620 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, /* 620 */ 281, 281, 281, 281, 281, 21, 21, 281, 281, 281,
/* 630 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, /* 630 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
/* 640 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, /* 640 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
/* 650 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, /* 650 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
...@@ -351,93 +363,94 @@ static const YYCODETYPE yy_lookahead[] = { ...@@ -351,93 +363,94 @@ static const YYCODETYPE yy_lookahead[] = {
/* 790 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, /* 790 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
/* 800 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, /* 800 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
/* 810 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, /* 810 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
/* 820 */ 281, 281, 281, 281, 281, /* 820 */ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
/* 830 */ 281, 281, 281, 281, 281, 281, 281,
}; };
#define YY_SHIFT_COUNT (282) #define YY_SHIFT_COUNT (289)
#define YY_SHIFT_MIN (0) #define YY_SHIFT_MIN (0)
#define YY_SHIFT_MAX (601) #define YY_SHIFT_MAX (613)
static const unsigned short int yy_shift_ofst[] = { static const unsigned short int yy_shift_ofst[] = {
/* 0 */ 140, 24, 137, 12, 194, 213, 21, 21, 21, 21, /* 0 */ 140, 24, 137, 9, 194, 213, 3, 3, 3, 3,
/* 10 */ 21, 21, 21, 21, 21, 0, 22, 213, 273, 273, /* 10 */ 3, 3, 3, 3, 3, 0, 22, 213, 233, 233,
/* 20 */ 273, 61, 21, 21, 21, 88, 21, 21, 6, 12, /* 20 */ 233, 233, 96, 3, 3, 3, 3, 259, 3, 3,
/* 30 */ 47, 47, 615, 213, 213, 213, 213, 213, 213, 213, /* 30 */ 23, 9, 69, 69, 627, 213, 213, 213, 213, 213,
/* 40 */ 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, /* 40 */ 213, 213, 213, 213, 213, 213, 213, 213, 213, 213,
/* 50 */ 213, 273, 273, 2, 2, 2, 2, 2, 2, 2, /* 50 */ 213, 213, 213, 233, 233, 2, 2, 2, 2, 2,
/* 60 */ 239, 21, 21, 232, 21, 21, 21, 28, 28, 230, /* 60 */ 2, 2, 204, 3, 3, 53, 3, 3, 3, 225,
/* 70 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, /* 70 */ 225, 246, 3, 3, 3, 3, 3, 3, 3, 3,
/* 80 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, /* 80 */ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
/* 90 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, /* 90 */ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
/* 100 */ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, /* 100 */ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
/* 110 */ 21, 21, 21, 21, 21, 21, 318, 378, 378, 378, /* 110 */ 3, 3, 3, 3, 3, 3, 3, 3, 3, 325,
/* 120 */ 330, 330, 330, 378, 329, 332, 336, 344, 342, 353, /* 120 */ 385, 385, 385, 332, 332, 332, 385, 343, 346, 352,
/* 130 */ 356, 358, 347, 318, 378, 378, 378, 12, 378, 378, /* 130 */ 356, 354, 360, 362, 369, 357, 325, 385, 385, 385,
/* 140 */ 393, 396, 432, 401, 404, 439, 414, 418, 378, 426, /* 140 */ 9, 385, 385, 402, 405, 441, 410, 409, 442, 415,
/* 150 */ 378, 426, 378, 426, 378, 615, 615, 27, 70, 70, /* 150 */ 418, 385, 428, 385, 428, 385, 428, 385, 627, 627,
/* 160 */ 70, 130, 155, 234, 234, 234, 223, 196, 235, 278, /* 160 */ 27, 67, 67, 67, 130, 155, 247, 247, 247, 221,
/* 170 */ 278, 278, 278, 151, 14, 148, 148, 219, 107, 266, /* 170 */ 231, 242, 282, 282, 282, 282, 120, 35, 292, 292,
/* 180 */ 244, 248, 249, 250, 251, 257, 258, 197, 328, 9, /* 180 */ 138, 136, 285, 251, 216, 254, 256, 261, 262, 263,
/* 190 */ 302, 259, 255, 261, 264, 267, 268, 243, 245, 254, /* 190 */ 350, 365, 337, 274, 351, 265, 271, 276, 277, 278,
/* 200 */ 282, 256, 386, 387, 298, 334, 499, 365, 501, 505, /* 200 */ 279, 284, 272, 255, 260, 264, 298, 269, 399, 400,
/* 210 */ 373, 510, 511, 430, 388, 408, 419, 412, 421, 440, /* 210 */ 334, 349, 504, 372, 510, 511, 377, 513, 514, 435,
/* 220 */ 433, 441, 444, 541, 445, 448, 450, 446, 435, 449, /* 220 */ 393, 417, 427, 419, 429, 431, 430, 437, 448, 550,
/* 230 */ 436, 455, 451, 452, 457, 421, 458, 459, 456, 488, /* 230 */ 452, 454, 453, 455, 439, 461, 440, 458, 467, 462,
/* 240 */ 555, 560, 561, 562, 563, 564, 492, 556, 498, 442, /* 240 */ 468, 429, 470, 469, 471, 472, 500, 566, 571, 573,
/* 250 */ 466, 466, 558, 443, 447, 466, 570, 573, 477, 466, /* 250 */ 574, 575, 576, 505, 567, 512, 450, 479, 479, 572,
/* 260 */ 575, 577, 578, 579, 580, 581, 582, 583, 584, 585, /* 260 */ 456, 457, 479, 582, 584, 490, 479, 588, 589, 590,
/* 270 */ 586, 587, 588, 589, 590, 591, 490, 520, 592, 593, /* 270 */ 591, 592, 593, 594, 595, 596, 597, 598, 599, 600,
/* 280 */ 540, 542, 601, /* 280 */ 601, 602, 603, 503, 532, 604, 605, 552, 554, 613,
}; };
#define YY_REDUCE_COUNT (156) #define YY_REDUCE_COUNT (159)
#define YY_REDUCE_MIN (-268) #define YY_REDUCE_MIN (-260)
#define YY_REDUCE_MAX (324) #define YY_REDUCE_MAX (339)
static const short yy_reduce_ofst[] = { static const short yy_reduce_ofst[] = {
/* 0 */ -208, -102, 10, -41, -268, -178, -196, -151, -115, 67, /* 0 */ -208, -101, 21, -40, -181, -118, -205, -151, 50, -64,
/* 10 */ 74, 80, 84, 87, 95, -214, -164, -265, -223, -150, /* 10 */ 74, 81, 83, 89, 93, -213, -207, -251, -198, -85,
/* 20 */ -65, -93, -172, -23, 42, -22, 99, -16, -2, -14, /* 20 */ -70, -39, -211, -163, -191, -150, -54, 1, 94, 63,
/* 30 */ 3, 58, 54, -264, -251, -241, -177, -25, 19, 30, /* 30 */ -202, 30, 4, 134, -160, -260, -259, -240, -167, -117,
/* 40 */ 93, 110, 114, 127, 128, 129, 131, 132, 134, 135, /* 40 */ -93, -66, -53, -41, -26, -13, -1, 117, 121, 125,
/* 50 */ 136, -193, -78, 153, 160, 161, 162, 163, 164, 165, /* 50 */ 142, 143, 144, 145, 160, 33, 170, 171, 172, 173,
/* 60 */ 166, 199, 200, 146, 202, 203, 204, 143, 144, 167, /* 60 */ 174, 175, 169, 210, 211, 156, 214, 215, 217, 149,
/* 70 */ 208, 209, 211, 212, 214, 215, 216, 217, 218, 220, /* 70 */ 152, 176, 218, 219, 222, 223, 224, 226, 227, 228,
/* 80 */ 221, 222, 224, 225, 226, 227, 228, 229, 231, 233, /* 80 */ 229, 230, 232, 234, 235, 236, 237, 238, 239, 240,
/* 90 */ 236, 237, 238, 240, 241, 242, 246, 247, 252, 253, /* 90 */ 241, 243, 244, 245, 248, 249, 250, 252, 253, 257,
/* 100 */ 260, 262, 263, 265, 269, 270, 271, 272, 274, 275, /* 100 */ 258, 266, 267, 268, 270, 273, 275, 280, 281, 283,
/* 110 */ 276, 277, 279, 280, 281, 283, 180, 284, 285, 286, /* 110 */ 286, 287, 288, 289, 290, 291, 293, 294, 295, 185,
/* 120 */ 173, 175, 176, 287, 191, 198, 201, 205, 207, 210, /* 120 */ 296, 297, 299, 182, 187, 191, 300, 202, 208, 205,
/* 130 */ 288, 290, 289, 291, 292, 293, 294, 295, 296, 297, /* 130 */ 301, 220, 302, 305, 303, 308, 304, 306, 307, 309,
/* 140 */ 299, 301, 300, 303, 304, 307, 308, 310, 305, 306, /* 140 */ 310, 311, 312, 313, 315, 314, 316, 318, 321, 322,
/* 150 */ 309, 319, 321, 322, 324, 314, 320, /* 150 */ 324, 317, 319, 323, 320, 333, 335, 338, 329, 339,
}; };
static const YYACTIONTYPE yy_default[] = { static const YYACTIONTYPE yy_default[] = {
/* 0 */ 713, 768, 757, 765, 950, 950, 713, 713, 713, 713, /* 0 */ 726, 781, 770, 778, 966, 966, 726, 726, 726, 726,
/* 10 */ 713, 713, 713, 713, 713, 873, 731, 950, 713, 713, /* 10 */ 726, 726, 726, 726, 726, 889, 744, 966, 726, 726,
/* 20 */ 713, 713, 713, 713, 713, 765, 713, 713, 770, 765, /* 20 */ 726, 726, 726, 726, 726, 726, 726, 778, 726, 726,
/* 30 */ 770, 770, 868, 713, 713, 713, 713, 713, 713, 713, /* 30 */ 783, 778, 783, 783, 884, 726, 726, 726, 726, 726,
/* 40 */ 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, /* 40 */ 726, 726, 726, 726, 726, 726, 726, 726, 726, 726,
/* 50 */ 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, /* 50 */ 726, 726, 726, 726, 726, 726, 726, 726, 726, 726,
/* 60 */ 713, 713, 713, 875, 877, 879, 713, 897, 897, 866, /* 60 */ 726, 726, 726, 726, 726, 891, 893, 895, 726, 913,
/* 70 */ 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, /* 70 */ 913, 882, 726, 726, 726, 726, 726, 726, 726, 726,
/* 80 */ 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, /* 80 */ 726, 726, 726, 726, 726, 726, 726, 726, 726, 726,
/* 90 */ 713, 713, 713, 713, 755, 713, 753, 713, 713, 713, /* 90 */ 726, 726, 726, 726, 726, 726, 726, 768, 726, 766,
/* 100 */ 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, /* 100 */ 726, 726, 726, 726, 726, 726, 726, 726, 726, 726,
/* 110 */ 741, 713, 713, 713, 713, 713, 713, 733, 733, 733, /* 110 */ 726, 726, 726, 754, 726, 726, 726, 726, 726, 726,
/* 120 */ 713, 713, 713, 733, 904, 908, 902, 890, 898, 889, /* 120 */ 746, 746, 746, 726, 726, 726, 746, 920, 924, 918,
/* 130 */ 885, 884, 912, 713, 733, 733, 733, 765, 733, 733, /* 130 */ 906, 914, 905, 901, 900, 928, 726, 746, 746, 746,
/* 140 */ 786, 784, 782, 774, 780, 776, 778, 772, 733, 763, /* 140 */ 778, 746, 746, 799, 797, 795, 787, 793, 789, 791,
/* 150 */ 733, 763, 733, 763, 733, 804, 820, 713, 913, 949, /* 150 */ 785, 746, 776, 746, 776, 746, 776, 746, 817, 833,
/* 160 */ 903, 939, 938, 945, 937, 936, 713, 713, 713, 932, /* 160 */ 726, 929, 965, 919, 955, 954, 961, 953, 952, 726,
/* 170 */ 933, 935, 934, 713, 713, 941, 940, 713, 713, 713, /* 170 */ 726, 726, 948, 949, 951, 950, 726, 726, 957, 956,
/* 180 */ 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, /* 180 */ 726, 726, 726, 726, 726, 726, 726, 726, 726, 726,
/* 190 */ 915, 713, 909, 905, 713, 713, 713, 713, 713, 713, /* 190 */ 726, 726, 726, 931, 726, 925, 921, 726, 726, 726,
/* 200 */ 830, 713, 713, 713, 713, 713, 713, 713, 713, 713, /* 200 */ 726, 726, 726, 726, 726, 726, 843, 726, 726, 726,
/* 210 */ 713, 713, 713, 713, 713, 865, 713, 713, 713, 713, /* 210 */ 726, 726, 726, 726, 726, 726, 726, 726, 726, 726,
/* 220 */ 876, 713, 713, 713, 713, 713, 713, 899, 713, 891, /* 220 */ 726, 881, 726, 726, 726, 726, 892, 726, 726, 726,
/* 230 */ 713, 713, 713, 713, 713, 842, 713, 713, 713, 713, /* 230 */ 726, 726, 726, 915, 726, 907, 726, 726, 726, 726,
/* 240 */ 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, /* 240 */ 726, 855, 726, 726, 726, 726, 726, 726, 726, 726,
/* 250 */ 960, 958, 713, 713, 713, 954, 713, 713, 713, 952, /* 250 */ 726, 726, 726, 726, 726, 726, 726, 976, 974, 726,
/* 260 */ 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, /* 260 */ 726, 726, 970, 726, 726, 726, 968, 726, 726, 726,
/* 270 */ 713, 713, 713, 713, 713, 713, 789, 713, 739, 737, /* 270 */ 726, 726, 726, 726, 726, 726, 726, 726, 726, 726,
/* 280 */ 713, 729, 713, /* 280 */ 726, 726, 726, 802, 726, 752, 750, 726, 742, 726,
}; };
/********** End of lemon-generated parsing tables *****************************/ /********** End of lemon-generated parsing tables *****************************/
...@@ -563,8 +576,8 @@ static const YYCODETYPE yyFallback[] = { ...@@ -563,8 +576,8 @@ static const YYCODETYPE yyFallback[] = {
0, /* UNSIGNED => nothing */ 0, /* UNSIGNED => nothing */
0, /* TAGS => nothing */ 0, /* TAGS => nothing */
0, /* USING => nothing */ 0, /* USING => nothing */
0, /* AS => nothing */
0, /* COMMA => nothing */ 0, /* COMMA => nothing */
0, /* AS => nothing */
1, /* NULL => ID */ 1, /* NULL => ID */
0, /* SELECT => nothing */ 0, /* SELECT => nothing */
0, /* UNION => nothing */ 0, /* UNION => nothing */
...@@ -706,6 +719,7 @@ struct yyParser { ...@@ -706,6 +719,7 @@ struct yyParser {
int yyerrcnt; /* Shifts left before out of the error */ int yyerrcnt; /* Shifts left before out of the error */
#endif #endif
ParseARG_SDECL /* A place to hold %extra_argument */ ParseARG_SDECL /* A place to hold %extra_argument */
ParseCTX_SDECL /* A place to hold %extra_context */
#if YYSTACKDEPTH<=0 #if YYSTACKDEPTH<=0
int yystksz; /* Current side of the stack */ int yystksz; /* Current side of the stack */
yyStackEntry *yystack; /* The parser's stack */ yyStackEntry *yystack; /* The parser's stack */
...@@ -859,8 +873,8 @@ static const char *const yyTokenName[] = { ...@@ -859,8 +873,8 @@ static const char *const yyTokenName[] = {
/* 103 */ "UNSIGNED", /* 103 */ "UNSIGNED",
/* 104 */ "TAGS", /* 104 */ "TAGS",
/* 105 */ "USING", /* 105 */ "USING",
/* 106 */ "AS", /* 106 */ "COMMA",
/* 107 */ "COMMA", /* 107 */ "AS",
/* 108 */ "NULL", /* 108 */ "NULL",
/* 109 */ "SELECT", /* 109 */ "SELECT",
/* 110 */ "UNION", /* 110 */ "UNION",
...@@ -963,49 +977,49 @@ static const char *const yyTokenName[] = { ...@@ -963,49 +977,49 @@ static const char *const yyTokenName[] = {
/* 207 */ "INSERT", /* 207 */ "INSERT",
/* 208 */ "INTO", /* 208 */ "INTO",
/* 209 */ "VALUES", /* 209 */ "VALUES",
/* 210 */ "error", /* 210 */ "program",
/* 211 */ "program", /* 211 */ "cmd",
/* 212 */ "cmd", /* 212 */ "dbPrefix",
/* 213 */ "dbPrefix", /* 213 */ "ids",
/* 214 */ "ids", /* 214 */ "cpxName",
/* 215 */ "cpxName", /* 215 */ "ifexists",
/* 216 */ "ifexists", /* 216 */ "alter_db_optr",
/* 217 */ "alter_db_optr", /* 217 */ "acct_optr",
/* 218 */ "acct_optr", /* 218 */ "ifnotexists",
/* 219 */ "ifnotexists", /* 219 */ "db_optr",
/* 220 */ "db_optr", /* 220 */ "pps",
/* 221 */ "pps", /* 221 */ "tseries",
/* 222 */ "tseries", /* 222 */ "dbs",
/* 223 */ "dbs", /* 223 */ "streams",
/* 224 */ "streams", /* 224 */ "storage",
/* 225 */ "storage", /* 225 */ "qtime",
/* 226 */ "qtime", /* 226 */ "users",
/* 227 */ "users", /* 227 */ "conns",
/* 228 */ "conns", /* 228 */ "state",
/* 229 */ "state", /* 229 */ "keep",
/* 230 */ "keep", /* 230 */ "tagitemlist",
/* 231 */ "tagitemlist", /* 231 */ "cache",
/* 232 */ "cache", /* 232 */ "replica",
/* 233 */ "replica", /* 233 */ "quorum",
/* 234 */ "quorum", /* 234 */ "days",
/* 235 */ "days", /* 235 */ "minrows",
/* 236 */ "minrows", /* 236 */ "maxrows",
/* 237 */ "maxrows", /* 237 */ "blocks",
/* 238 */ "blocks", /* 238 */ "ctime",
/* 239 */ "ctime", /* 239 */ "wal",
/* 240 */ "wal", /* 240 */ "fsync",
/* 241 */ "fsync", /* 241 */ "comp",
/* 242 */ "comp", /* 242 */ "prec",
/* 243 */ "prec", /* 243 */ "update",
/* 244 */ "update", /* 244 */ "cachelast",
/* 245 */ "cachelast", /* 245 */ "typename",
/* 246 */ "typename", /* 246 */ "signed",
/* 247 */ "signed", /* 247 */ "create_table_args",
/* 248 */ "create_table_args", /* 248 */ "create_stable_args",
/* 249 */ "create_stable_args", /* 249 */ "create_table_list",
/* 250 */ "create_table_list", /* 250 */ "create_from_stable",
/* 251 */ "create_from_stable", /* 251 */ "columnlist",
/* 252 */ "columnlist", /* 252 */ "tagNamelist",
/* 253 */ "select", /* 253 */ "select",
/* 254 */ "column", /* 254 */ "column",
/* 255 */ "tagitem", /* 255 */ "tagitem",
...@@ -1170,127 +1184,130 @@ static const char *const yyRuleName[] = { ...@@ -1170,127 +1184,130 @@ static const char *const yyRuleName[] = {
/* 126 */ "create_table_args ::= ifnotexists ids cpxName LP columnlist RP", /* 126 */ "create_table_args ::= ifnotexists ids cpxName LP columnlist RP",
/* 127 */ "create_stable_args ::= ifnotexists ids cpxName LP columnlist RP TAGS LP columnlist RP", /* 127 */ "create_stable_args ::= ifnotexists ids cpxName LP columnlist RP TAGS LP columnlist RP",
/* 128 */ "create_from_stable ::= ifnotexists ids cpxName USING ids cpxName TAGS LP tagitemlist RP", /* 128 */ "create_from_stable ::= ifnotexists ids cpxName USING ids cpxName TAGS LP tagitemlist RP",
/* 129 */ "create_table_args ::= ifnotexists ids cpxName AS select", /* 129 */ "create_from_stable ::= ifnotexists ids cpxName USING ids cpxName LP tagNamelist RP TAGS LP tagitemlist RP",
/* 130 */ "columnlist ::= columnlist COMMA column", /* 130 */ "tagNamelist ::= tagNamelist COMMA ids",
/* 131 */ "columnlist ::= column", /* 131 */ "tagNamelist ::= ids",
/* 132 */ "column ::= ids typename", /* 132 */ "create_table_args ::= ifnotexists ids cpxName AS select",
/* 133 */ "tagitemlist ::= tagitemlist COMMA tagitem", /* 133 */ "columnlist ::= columnlist COMMA column",
/* 134 */ "tagitemlist ::= tagitem", /* 134 */ "columnlist ::= column",
/* 135 */ "tagitem ::= INTEGER", /* 135 */ "column ::= ids typename",
/* 136 */ "tagitem ::= FLOAT", /* 136 */ "tagitemlist ::= tagitemlist COMMA tagitem",
/* 137 */ "tagitem ::= STRING", /* 137 */ "tagitemlist ::= tagitem",
/* 138 */ "tagitem ::= BOOL", /* 138 */ "tagitem ::= INTEGER",
/* 139 */ "tagitem ::= NULL", /* 139 */ "tagitem ::= FLOAT",
/* 140 */ "tagitem ::= MINUS INTEGER", /* 140 */ "tagitem ::= STRING",
/* 141 */ "tagitem ::= MINUS FLOAT", /* 141 */ "tagitem ::= BOOL",
/* 142 */ "tagitem ::= PLUS INTEGER", /* 142 */ "tagitem ::= NULL",
/* 143 */ "tagitem ::= PLUS FLOAT", /* 143 */ "tagitem ::= MINUS INTEGER",
/* 144 */ "select ::= SELECT selcollist from where_opt interval_opt fill_opt sliding_opt groupby_opt orderby_opt having_opt slimit_opt limit_opt", /* 144 */ "tagitem ::= MINUS FLOAT",
/* 145 */ "union ::= select", /* 145 */ "tagitem ::= PLUS INTEGER",
/* 146 */ "union ::= LP union RP", /* 146 */ "tagitem ::= PLUS FLOAT",
/* 147 */ "union ::= union UNION ALL select", /* 147 */ "select ::= SELECT selcollist from where_opt interval_opt fill_opt sliding_opt groupby_opt orderby_opt having_opt slimit_opt limit_opt",
/* 148 */ "union ::= union UNION ALL LP select RP", /* 148 */ "union ::= select",
/* 149 */ "cmd ::= union", /* 149 */ "union ::= LP union RP",
/* 150 */ "select ::= SELECT selcollist", /* 150 */ "union ::= union UNION ALL select",
/* 151 */ "sclp ::= selcollist COMMA", /* 151 */ "union ::= union UNION ALL LP select RP",
/* 152 */ "sclp ::=", /* 152 */ "cmd ::= union",
/* 153 */ "selcollist ::= sclp distinct expr as", /* 153 */ "select ::= SELECT selcollist",
/* 154 */ "selcollist ::= sclp STAR", /* 154 */ "sclp ::= selcollist COMMA",
/* 155 */ "as ::= AS ids", /* 155 */ "sclp ::=",
/* 156 */ "as ::= ids", /* 156 */ "selcollist ::= sclp distinct expr as",
/* 157 */ "as ::=", /* 157 */ "selcollist ::= sclp STAR",
/* 158 */ "distinct ::= DISTINCT", /* 158 */ "as ::= AS ids",
/* 159 */ "distinct ::=", /* 159 */ "as ::= ids",
/* 160 */ "from ::= FROM tablelist", /* 160 */ "as ::=",
/* 161 */ "tablelist ::= ids cpxName", /* 161 */ "distinct ::= DISTINCT",
/* 162 */ "tablelist ::= ids cpxName ids", /* 162 */ "distinct ::=",
/* 163 */ "tablelist ::= tablelist COMMA ids cpxName", /* 163 */ "from ::= FROM tablelist",
/* 164 */ "tablelist ::= tablelist COMMA ids cpxName ids", /* 164 */ "tablelist ::= ids cpxName",
/* 165 */ "tmvar ::= VARIABLE", /* 165 */ "tablelist ::= ids cpxName ids",
/* 166 */ "interval_opt ::= INTERVAL LP tmvar RP", /* 166 */ "tablelist ::= tablelist COMMA ids cpxName",
/* 167 */ "interval_opt ::= INTERVAL LP tmvar COMMA tmvar RP", /* 167 */ "tablelist ::= tablelist COMMA ids cpxName ids",
/* 168 */ "interval_opt ::=", /* 168 */ "tmvar ::= VARIABLE",
/* 169 */ "fill_opt ::=", /* 169 */ "interval_opt ::= INTERVAL LP tmvar RP",
/* 170 */ "fill_opt ::= FILL LP ID COMMA tagitemlist RP", /* 170 */ "interval_opt ::= INTERVAL LP tmvar COMMA tmvar RP",
/* 171 */ "fill_opt ::= FILL LP ID RP", /* 171 */ "interval_opt ::=",
/* 172 */ "sliding_opt ::= SLIDING LP tmvar RP", /* 172 */ "fill_opt ::=",
/* 173 */ "sliding_opt ::=", /* 173 */ "fill_opt ::= FILL LP ID COMMA tagitemlist RP",
/* 174 */ "orderby_opt ::=", /* 174 */ "fill_opt ::= FILL LP ID RP",
/* 175 */ "orderby_opt ::= ORDER BY sortlist", /* 175 */ "sliding_opt ::= SLIDING LP tmvar RP",
/* 176 */ "sortlist ::= sortlist COMMA item sortorder", /* 176 */ "sliding_opt ::=",
/* 177 */ "sortlist ::= item sortorder", /* 177 */ "orderby_opt ::=",
/* 178 */ "item ::= ids cpxName", /* 178 */ "orderby_opt ::= ORDER BY sortlist",
/* 179 */ "sortorder ::= ASC", /* 179 */ "sortlist ::= sortlist COMMA item sortorder",
/* 180 */ "sortorder ::= DESC", /* 180 */ "sortlist ::= item sortorder",
/* 181 */ "sortorder ::=", /* 181 */ "item ::= ids cpxName",
/* 182 */ "groupby_opt ::=", /* 182 */ "sortorder ::= ASC",
/* 183 */ "groupby_opt ::= GROUP BY grouplist", /* 183 */ "sortorder ::= DESC",
/* 184 */ "grouplist ::= grouplist COMMA item", /* 184 */ "sortorder ::=",
/* 185 */ "grouplist ::= item", /* 185 */ "groupby_opt ::=",
/* 186 */ "having_opt ::=", /* 186 */ "groupby_opt ::= GROUP BY grouplist",
/* 187 */ "having_opt ::= HAVING expr", /* 187 */ "grouplist ::= grouplist COMMA item",
/* 188 */ "limit_opt ::=", /* 188 */ "grouplist ::= item",
/* 189 */ "limit_opt ::= LIMIT signed", /* 189 */ "having_opt ::=",
/* 190 */ "limit_opt ::= LIMIT signed OFFSET signed", /* 190 */ "having_opt ::= HAVING expr",
/* 191 */ "limit_opt ::= LIMIT signed COMMA signed", /* 191 */ "limit_opt ::=",
/* 192 */ "slimit_opt ::=", /* 192 */ "limit_opt ::= LIMIT signed",
/* 193 */ "slimit_opt ::= SLIMIT signed", /* 193 */ "limit_opt ::= LIMIT signed OFFSET signed",
/* 194 */ "slimit_opt ::= SLIMIT signed SOFFSET signed", /* 194 */ "limit_opt ::= LIMIT signed COMMA signed",
/* 195 */ "slimit_opt ::= SLIMIT signed COMMA signed", /* 195 */ "slimit_opt ::=",
/* 196 */ "where_opt ::=", /* 196 */ "slimit_opt ::= SLIMIT signed",
/* 197 */ "where_opt ::= WHERE expr", /* 197 */ "slimit_opt ::= SLIMIT signed SOFFSET signed",
/* 198 */ "expr ::= LP expr RP", /* 198 */ "slimit_opt ::= SLIMIT signed COMMA signed",
/* 199 */ "expr ::= ID", /* 199 */ "where_opt ::=",
/* 200 */ "expr ::= ID DOT ID", /* 200 */ "where_opt ::= WHERE expr",
/* 201 */ "expr ::= ID DOT STAR", /* 201 */ "expr ::= LP expr RP",
/* 202 */ "expr ::= INTEGER", /* 202 */ "expr ::= ID",
/* 203 */ "expr ::= MINUS INTEGER", /* 203 */ "expr ::= ID DOT ID",
/* 204 */ "expr ::= PLUS INTEGER", /* 204 */ "expr ::= ID DOT STAR",
/* 205 */ "expr ::= FLOAT", /* 205 */ "expr ::= INTEGER",
/* 206 */ "expr ::= MINUS FLOAT", /* 206 */ "expr ::= MINUS INTEGER",
/* 207 */ "expr ::= PLUS FLOAT", /* 207 */ "expr ::= PLUS INTEGER",
/* 208 */ "expr ::= STRING", /* 208 */ "expr ::= FLOAT",
/* 209 */ "expr ::= NOW", /* 209 */ "expr ::= MINUS FLOAT",
/* 210 */ "expr ::= VARIABLE", /* 210 */ "expr ::= PLUS FLOAT",
/* 211 */ "expr ::= BOOL", /* 211 */ "expr ::= STRING",
/* 212 */ "expr ::= ID LP exprlist RP", /* 212 */ "expr ::= NOW",
/* 213 */ "expr ::= ID LP STAR RP", /* 213 */ "expr ::= VARIABLE",
/* 214 */ "expr ::= expr IS NULL", /* 214 */ "expr ::= BOOL",
/* 215 */ "expr ::= expr IS NOT NULL", /* 215 */ "expr ::= ID LP exprlist RP",
/* 216 */ "expr ::= expr LT expr", /* 216 */ "expr ::= ID LP STAR RP",
/* 217 */ "expr ::= expr GT expr", /* 217 */ "expr ::= expr IS NULL",
/* 218 */ "expr ::= expr LE expr", /* 218 */ "expr ::= expr IS NOT NULL",
/* 219 */ "expr ::= expr GE expr", /* 219 */ "expr ::= expr LT expr",
/* 220 */ "expr ::= expr NE expr", /* 220 */ "expr ::= expr GT expr",
/* 221 */ "expr ::= expr EQ expr", /* 221 */ "expr ::= expr LE expr",
/* 222 */ "expr ::= expr AND expr", /* 222 */ "expr ::= expr GE expr",
/* 223 */ "expr ::= expr OR expr", /* 223 */ "expr ::= expr NE expr",
/* 224 */ "expr ::= expr PLUS expr", /* 224 */ "expr ::= expr EQ expr",
/* 225 */ "expr ::= expr MINUS expr", /* 225 */ "expr ::= expr AND expr",
/* 226 */ "expr ::= expr STAR expr", /* 226 */ "expr ::= expr OR expr",
/* 227 */ "expr ::= expr SLASH expr", /* 227 */ "expr ::= expr PLUS expr",
/* 228 */ "expr ::= expr REM expr", /* 228 */ "expr ::= expr MINUS expr",
/* 229 */ "expr ::= expr LIKE expr", /* 229 */ "expr ::= expr STAR expr",
/* 230 */ "expr ::= expr IN LP exprlist RP", /* 230 */ "expr ::= expr SLASH expr",
/* 231 */ "exprlist ::= exprlist COMMA expritem", /* 231 */ "expr ::= expr REM expr",
/* 232 */ "exprlist ::= expritem", /* 232 */ "expr ::= expr LIKE expr",
/* 233 */ "expritem ::= expr", /* 233 */ "expr ::= expr IN LP exprlist RP",
/* 234 */ "expritem ::=", /* 234 */ "exprlist ::= exprlist COMMA expritem",
/* 235 */ "cmd ::= RESET QUERY CACHE", /* 235 */ "exprlist ::= expritem",
/* 236 */ "cmd ::= ALTER TABLE ids cpxName ADD COLUMN columnlist", /* 236 */ "expritem ::= expr",
/* 237 */ "cmd ::= ALTER TABLE ids cpxName DROP COLUMN ids", /* 237 */ "expritem ::=",
/* 238 */ "cmd ::= ALTER TABLE ids cpxName ADD TAG columnlist", /* 238 */ "cmd ::= RESET QUERY CACHE",
/* 239 */ "cmd ::= ALTER TABLE ids cpxName DROP TAG ids", /* 239 */ "cmd ::= ALTER TABLE ids cpxName ADD COLUMN columnlist",
/* 240 */ "cmd ::= ALTER TABLE ids cpxName CHANGE TAG ids ids", /* 240 */ "cmd ::= ALTER TABLE ids cpxName DROP COLUMN ids",
/* 241 */ "cmd ::= ALTER TABLE ids cpxName SET TAG ids EQ tagitem", /* 241 */ "cmd ::= ALTER TABLE ids cpxName ADD TAG columnlist",
/* 242 */ "cmd ::= ALTER STABLE ids cpxName ADD COLUMN columnlist", /* 242 */ "cmd ::= ALTER TABLE ids cpxName DROP TAG ids",
/* 243 */ "cmd ::= ALTER STABLE ids cpxName DROP COLUMN ids", /* 243 */ "cmd ::= ALTER TABLE ids cpxName CHANGE TAG ids ids",
/* 244 */ "cmd ::= ALTER STABLE ids cpxName ADD TAG columnlist", /* 244 */ "cmd ::= ALTER TABLE ids cpxName SET TAG ids EQ tagitem",
/* 245 */ "cmd ::= ALTER STABLE ids cpxName DROP TAG ids", /* 245 */ "cmd ::= ALTER STABLE ids cpxName ADD COLUMN columnlist",
/* 246 */ "cmd ::= ALTER STABLE ids cpxName CHANGE TAG ids ids", /* 246 */ "cmd ::= ALTER STABLE ids cpxName DROP COLUMN ids",
/* 247 */ "cmd ::= KILL CONNECTION INTEGER", /* 247 */ "cmd ::= ALTER STABLE ids cpxName ADD TAG columnlist",
/* 248 */ "cmd ::= KILL STREAM INTEGER COLON INTEGER", /* 248 */ "cmd ::= ALTER STABLE ids cpxName DROP TAG ids",
/* 249 */ "cmd ::= KILL QUERY INTEGER COLON INTEGER", /* 249 */ "cmd ::= ALTER STABLE ids cpxName CHANGE TAG ids ids",
/* 250 */ "cmd ::= KILL CONNECTION INTEGER",
/* 251 */ "cmd ::= KILL STREAM INTEGER COLON INTEGER",
/* 252 */ "cmd ::= KILL QUERY INTEGER COLON INTEGER",
}; };
#endif /* NDEBUG */ #endif /* NDEBUG */
...@@ -1339,28 +1356,29 @@ static int yyGrowStack(yyParser *p){ ...@@ -1339,28 +1356,29 @@ static int yyGrowStack(yyParser *p){
/* Initialize a new parser that has already been allocated. /* Initialize a new parser that has already been allocated.
*/ */
void ParseInit(void *yypParser){ void ParseInit(void *yypRawParser ParseCTX_PDECL){
yyParser *pParser = (yyParser*)yypParser; yyParser *yypParser = (yyParser*)yypRawParser;
ParseCTX_STORE
#ifdef YYTRACKMAXSTACKDEPTH #ifdef YYTRACKMAXSTACKDEPTH
pParser->yyhwm = 0; yypParser->yyhwm = 0;
#endif #endif
#if YYSTACKDEPTH<=0 #if YYSTACKDEPTH<=0
pParser->yytos = NULL; yypParser->yytos = NULL;
pParser->yystack = NULL; yypParser->yystack = NULL;
pParser->yystksz = 0; yypParser->yystksz = 0;
if( yyGrowStack(pParser) ){ if( yyGrowStack(yypParser) ){
pParser->yystack = &pParser->yystk0; yypParser->yystack = &yypParser->yystk0;
pParser->yystksz = 1; yypParser->yystksz = 1;
} }
#endif #endif
#ifndef YYNOERRORRECOVERY #ifndef YYNOERRORRECOVERY
pParser->yyerrcnt = -1; yypParser->yyerrcnt = -1;
#endif #endif
pParser->yytos = pParser->yystack; yypParser->yytos = yypParser->yystack;
pParser->yystack[0].stateno = 0; yypParser->yystack[0].stateno = 0;
pParser->yystack[0].major = 0; yypParser->yystack[0].major = 0;
#if YYSTACKDEPTH>0 #if YYSTACKDEPTH>0
pParser->yystackEnd = &pParser->yystack[YYSTACKDEPTH-1]; yypParser->yystackEnd = &yypParser->yystack[YYSTACKDEPTH-1];
#endif #endif
} }
...@@ -1377,11 +1395,14 @@ void ParseInit(void *yypParser){ ...@@ -1377,11 +1395,14 @@ void ParseInit(void *yypParser){
** A pointer to a parser. This pointer is used in subsequent calls ** A pointer to a parser. This pointer is used in subsequent calls
** to Parse and ParseFree. ** to Parse and ParseFree.
*/ */
void *ParseAlloc(void *(*mallocProc)(YYMALLOCARGTYPE)){ void *ParseAlloc(void *(*mallocProc)(YYMALLOCARGTYPE) ParseCTX_PDECL){
yyParser *pParser; yyParser *yypParser;
pParser = (yyParser*)(*mallocProc)( (YYMALLOCARGTYPE)sizeof(yyParser) ); yypParser = (yyParser*)(*mallocProc)( (YYMALLOCARGTYPE)sizeof(yyParser) );
if( pParser ) ParseInit(pParser); if( yypParser ){
return pParser; ParseCTX_STORE
ParseInit(yypParser ParseCTX_PARAM);
}
return (void*)yypParser;
} }
#endif /* Parse_ENGINEALWAYSONSTACK */ #endif /* Parse_ENGINEALWAYSONSTACK */
...@@ -1398,7 +1419,8 @@ static void yy_destructor( ...@@ -1398,7 +1419,8 @@ static void yy_destructor(
YYCODETYPE yymajor, /* Type code for object to destroy */ YYCODETYPE yymajor, /* Type code for object to destroy */
YYMINORTYPE *yypminor /* The object to be destroyed */ YYMINORTYPE *yypminor /* The object to be destroyed */
){ ){
ParseARG_FETCH; ParseARG_FETCH
ParseCTX_FETCH
switch( yymajor ){ switch( yymajor ){
/* Here is inserted the actions which take place when a /* Here is inserted the actions which take place when a
** terminal or non-terminal is destroyed. This can happen ** terminal or non-terminal is destroyed. This can happen
...@@ -1411,9 +1433,10 @@ static void yy_destructor( ...@@ -1411,9 +1433,10 @@ static void yy_destructor(
** inside the C code. ** inside the C code.
*/ */
/********* Begin destructor definitions ***************************************/ /********* Begin destructor definitions ***************************************/
case 230: /* keep */ case 229: /* keep */
case 231: /* tagitemlist */ case 230: /* tagitemlist */
case 252: /* columnlist */ case 251: /* columnlist */
case 252: /* tagNamelist */
case 260: /* fill_opt */ case 260: /* fill_opt */
case 262: /* groupby_opt */ case 262: /* groupby_opt */
case 263: /* orderby_opt */ case 263: /* orderby_opt */
...@@ -1423,7 +1446,7 @@ static void yy_destructor( ...@@ -1423,7 +1446,7 @@ static void yy_destructor(
taosArrayDestroy((yypminor->yy247)); taosArrayDestroy((yypminor->yy247));
} }
break; break;
case 250: /* create_table_list */ case 249: /* create_table_list */
{ {
destroyCreateTableSql((yypminor->yy358)); destroyCreateTableSql((yypminor->yy358));
} }
...@@ -1567,13 +1590,12 @@ int ParseCoverage(FILE *out){ ...@@ -1567,13 +1590,12 @@ int ParseCoverage(FILE *out){
** Find the appropriate action for a parser given the terminal ** Find the appropriate action for a parser given the terminal
** look-ahead token iLookAhead. ** look-ahead token iLookAhead.
*/ */
static unsigned int yy_find_shift_action( static YYACTIONTYPE yy_find_shift_action(
yyParser *pParser, /* The parser */ YYCODETYPE iLookAhead, /* The look-ahead token */
YYCODETYPE iLookAhead /* The look-ahead token */ YYACTIONTYPE stateno /* Current state number */
){ ){
int i; int i;
int stateno = pParser->yytos->stateno;
if( stateno>YY_MAX_SHIFT ) return stateno; if( stateno>YY_MAX_SHIFT ) return stateno;
assert( stateno <= YY_SHIFT_COUNT ); assert( stateno <= YY_SHIFT_COUNT );
#if defined(YYCOVERAGE) #if defined(YYCOVERAGE)
...@@ -1581,15 +1603,19 @@ static unsigned int yy_find_shift_action( ...@@ -1581,15 +1603,19 @@ static unsigned int yy_find_shift_action(
#endif #endif
do{ do{
i = yy_shift_ofst[stateno]; i = yy_shift_ofst[stateno];
assert( i>=0 && i+YYNTOKEN<=sizeof(yy_lookahead)/sizeof(yy_lookahead[0]) ); assert( i>=0 );
assert( i<=YY_ACTTAB_COUNT );
assert( i+YYNTOKEN<=(int)YY_NLOOKAHEAD );
assert( iLookAhead!=YYNOCODE ); assert( iLookAhead!=YYNOCODE );
assert( iLookAhead < YYNTOKEN ); assert( iLookAhead < YYNTOKEN );
i += iLookAhead; i += iLookAhead;
assert( i<(int)YY_NLOOKAHEAD );
if( yy_lookahead[i]!=iLookAhead ){ if( yy_lookahead[i]!=iLookAhead ){
#ifdef YYFALLBACK #ifdef YYFALLBACK
YYCODETYPE iFallback; /* Fallback token */ YYCODETYPE iFallback; /* Fallback token */
if( iLookAhead<sizeof(yyFallback)/sizeof(yyFallback[0]) assert( iLookAhead<sizeof(yyFallback)/sizeof(yyFallback[0]) );
&& (iFallback = yyFallback[iLookAhead])!=0 ){ iFallback = yyFallback[iLookAhead];
if( iFallback!=0 ){
#ifndef NDEBUG #ifndef NDEBUG
if( yyTraceFILE ){ if( yyTraceFILE ){
fprintf(yyTraceFILE, "%sFALLBACK %s => %s\n", fprintf(yyTraceFILE, "%sFALLBACK %s => %s\n",
...@@ -1604,15 +1630,8 @@ static unsigned int yy_find_shift_action( ...@@ -1604,15 +1630,8 @@ static unsigned int yy_find_shift_action(
#ifdef YYWILDCARD #ifdef YYWILDCARD
{ {
int j = i - iLookAhead + YYWILDCARD; int j = i - iLookAhead + YYWILDCARD;
if( assert( j<(int)(sizeof(yy_lookahead)/sizeof(yy_lookahead[0])) );
#if YY_SHIFT_MIN+YYWILDCARD<0 if( yy_lookahead[j]==YYWILDCARD && iLookAhead>0 ){
j>=0 &&
#endif
#if YY_SHIFT_MAX+YYWILDCARD>=YY_ACTTAB_COUNT
j<YY_ACTTAB_COUNT &&
#endif
yy_lookahead[j]==YYWILDCARD && iLookAhead>0
){
#ifndef NDEBUG #ifndef NDEBUG
if( yyTraceFILE ){ if( yyTraceFILE ){
fprintf(yyTraceFILE, "%sWILDCARD %s => %s\n", fprintf(yyTraceFILE, "%sWILDCARD %s => %s\n",
...@@ -1626,6 +1645,7 @@ static unsigned int yy_find_shift_action( ...@@ -1626,6 +1645,7 @@ static unsigned int yy_find_shift_action(
#endif /* YYWILDCARD */ #endif /* YYWILDCARD */
return yy_default[stateno]; return yy_default[stateno];
}else{ }else{
assert( i>=0 && i<sizeof(yy_action)/sizeof(yy_action[0]) );
return yy_action[i]; return yy_action[i];
} }
}while(1); }while(1);
...@@ -1635,8 +1655,8 @@ static unsigned int yy_find_shift_action( ...@@ -1635,8 +1655,8 @@ static unsigned int yy_find_shift_action(
** Find the appropriate action for a parser given the non-terminal ** Find the appropriate action for a parser given the non-terminal
** look-ahead token iLookAhead. ** look-ahead token iLookAhead.
*/ */
static int yy_find_reduce_action( static YYACTIONTYPE yy_find_reduce_action(
int stateno, /* Current state number */ YYACTIONTYPE stateno, /* Current state number */
YYCODETYPE iLookAhead /* The look-ahead token */ YYCODETYPE iLookAhead /* The look-ahead token */
){ ){
int i; int i;
...@@ -1665,7 +1685,8 @@ static int yy_find_reduce_action( ...@@ -1665,7 +1685,8 @@ static int yy_find_reduce_action(
** The following routine is called if the stack overflows. ** The following routine is called if the stack overflows.
*/ */
static void yyStackOverflow(yyParser *yypParser){ static void yyStackOverflow(yyParser *yypParser){
ParseARG_FETCH; ParseARG_FETCH
ParseCTX_FETCH
#ifndef NDEBUG #ifndef NDEBUG
if( yyTraceFILE ){ if( yyTraceFILE ){
fprintf(yyTraceFILE,"%sStack Overflow!\n",yyTracePrompt); fprintf(yyTraceFILE,"%sStack Overflow!\n",yyTracePrompt);
...@@ -1676,7 +1697,8 @@ static void yyStackOverflow(yyParser *yypParser){ ...@@ -1676,7 +1697,8 @@ static void yyStackOverflow(yyParser *yypParser){
** stack every overflows */ ** stack every overflows */
/******** Begin %stack_overflow code ******************************************/ /******** Begin %stack_overflow code ******************************************/
/******** End %stack_overflow code ********************************************/ /******** End %stack_overflow code ********************************************/
ParseARG_STORE; /* Suppress warning about unused %extra_argument var */ ParseARG_STORE /* Suppress warning about unused %extra_argument var */
ParseCTX_STORE
} }
/* /*
...@@ -1705,8 +1727,8 @@ static void yyTraceShift(yyParser *yypParser, int yyNewState, const char *zTag){ ...@@ -1705,8 +1727,8 @@ static void yyTraceShift(yyParser *yypParser, int yyNewState, const char *zTag){
*/ */
static void yy_shift( static void yy_shift(
yyParser *yypParser, /* The parser to be shifted */ yyParser *yypParser, /* The parser to be shifted */
int yyNewState, /* The new state to shift in */ YYACTIONTYPE yyNewState, /* The new state to shift in */
int yyMajor, /* The major token to shift in */ YYCODETYPE yyMajor, /* The major token to shift in */
ParseTOKENTYPE yyMinor /* The minor token to shift in */ ParseTOKENTYPE yyMinor /* The minor token to shift in */
){ ){
yyStackEntry *yytos; yyStackEntry *yytos;
...@@ -1736,269 +1758,526 @@ static void yy_shift( ...@@ -1736,269 +1758,526 @@ static void yy_shift(
yyNewState += YY_MIN_REDUCE - YY_MIN_SHIFTREDUCE; yyNewState += YY_MIN_REDUCE - YY_MIN_SHIFTREDUCE;
} }
yytos = yypParser->yytos; yytos = yypParser->yytos;
yytos->stateno = (YYACTIONTYPE)yyNewState; yytos->stateno = yyNewState;
yytos->major = (YYCODETYPE)yyMajor; yytos->major = yyMajor;
yytos->minor.yy0 = yyMinor; yytos->minor.yy0 = yyMinor;
yyTraceShift(yypParser, yyNewState, "Shift"); yyTraceShift(yypParser, yyNewState, "Shift");
} }
/* The following table contains information about every rule that /* For rule J, yyRuleInfoLhs[J] contains the symbol on the left-hand side
** is used during the reduce. ** of that rule */
*/ static const YYCODETYPE yyRuleInfoLhs[] = {
static const struct { 210, /* (0) program ::= cmd */
YYCODETYPE lhs; /* Symbol on the left-hand side of the rule */ 211, /* (1) cmd ::= SHOW DATABASES */
signed char nrhs; /* Negative of the number of RHS symbols in the rule */ 211, /* (2) cmd ::= SHOW MNODES */
} yyRuleInfo[] = { 211, /* (3) cmd ::= SHOW DNODES */
{ 211, -1 }, /* (0) program ::= cmd */ 211, /* (4) cmd ::= SHOW ACCOUNTS */
{ 212, -2 }, /* (1) cmd ::= SHOW DATABASES */ 211, /* (5) cmd ::= SHOW USERS */
{ 212, -2 }, /* (2) cmd ::= SHOW MNODES */ 211, /* (6) cmd ::= SHOW MODULES */
{ 212, -2 }, /* (3) cmd ::= SHOW DNODES */ 211, /* (7) cmd ::= SHOW QUERIES */
{ 212, -2 }, /* (4) cmd ::= SHOW ACCOUNTS */ 211, /* (8) cmd ::= SHOW CONNECTIONS */
{ 212, -2 }, /* (5) cmd ::= SHOW USERS */ 211, /* (9) cmd ::= SHOW STREAMS */
{ 212, -2 }, /* (6) cmd ::= SHOW MODULES */ 211, /* (10) cmd ::= SHOW VARIABLES */
{ 212, -2 }, /* (7) cmd ::= SHOW QUERIES */ 211, /* (11) cmd ::= SHOW SCORES */
{ 212, -2 }, /* (8) cmd ::= SHOW CONNECTIONS */ 211, /* (12) cmd ::= SHOW GRANTS */
{ 212, -2 }, /* (9) cmd ::= SHOW STREAMS */ 211, /* (13) cmd ::= SHOW VNODES */
{ 212, -2 }, /* (10) cmd ::= SHOW VARIABLES */ 211, /* (14) cmd ::= SHOW VNODES IPTOKEN */
{ 212, -2 }, /* (11) cmd ::= SHOW SCORES */ 212, /* (15) dbPrefix ::= */
{ 212, -2 }, /* (12) cmd ::= SHOW GRANTS */ 212, /* (16) dbPrefix ::= ids DOT */
{ 212, -2 }, /* (13) cmd ::= SHOW VNODES */ 214, /* (17) cpxName ::= */
{ 212, -3 }, /* (14) cmd ::= SHOW VNODES IPTOKEN */ 214, /* (18) cpxName ::= DOT ids */
{ 213, 0 }, /* (15) dbPrefix ::= */ 211, /* (19) cmd ::= SHOW CREATE TABLE ids cpxName */
{ 213, -2 }, /* (16) dbPrefix ::= ids DOT */ 211, /* (20) cmd ::= SHOW CREATE DATABASE ids */
{ 215, 0 }, /* (17) cpxName ::= */ 211, /* (21) cmd ::= SHOW dbPrefix TABLES */
{ 215, -2 }, /* (18) cpxName ::= DOT ids */ 211, /* (22) cmd ::= SHOW dbPrefix TABLES LIKE ids */
{ 212, -5 }, /* (19) cmd ::= SHOW CREATE TABLE ids cpxName */ 211, /* (23) cmd ::= SHOW dbPrefix STABLES */
{ 212, -4 }, /* (20) cmd ::= SHOW CREATE DATABASE ids */ 211, /* (24) cmd ::= SHOW dbPrefix STABLES LIKE ids */
{ 212, -3 }, /* (21) cmd ::= SHOW dbPrefix TABLES */ 211, /* (25) cmd ::= SHOW dbPrefix VGROUPS */
{ 212, -5 }, /* (22) cmd ::= SHOW dbPrefix TABLES LIKE ids */ 211, /* (26) cmd ::= SHOW dbPrefix VGROUPS ids */
{ 212, -3 }, /* (23) cmd ::= SHOW dbPrefix STABLES */ 211, /* (27) cmd ::= DROP TABLE ifexists ids cpxName */
{ 212, -5 }, /* (24) cmd ::= SHOW dbPrefix STABLES LIKE ids */ 211, /* (28) cmd ::= DROP STABLE ifexists ids cpxName */
{ 212, -3 }, /* (25) cmd ::= SHOW dbPrefix VGROUPS */ 211, /* (29) cmd ::= DROP DATABASE ifexists ids */
{ 212, -4 }, /* (26) cmd ::= SHOW dbPrefix VGROUPS ids */ 211, /* (30) cmd ::= DROP DNODE ids */
{ 212, -5 }, /* (27) cmd ::= DROP TABLE ifexists ids cpxName */ 211, /* (31) cmd ::= DROP USER ids */
{ 212, -5 }, /* (28) cmd ::= DROP STABLE ifexists ids cpxName */ 211, /* (32) cmd ::= DROP ACCOUNT ids */
{ 212, -4 }, /* (29) cmd ::= DROP DATABASE ifexists ids */ 211, /* (33) cmd ::= USE ids */
{ 212, -3 }, /* (30) cmd ::= DROP DNODE ids */ 211, /* (34) cmd ::= DESCRIBE ids cpxName */
{ 212, -3 }, /* (31) cmd ::= DROP USER ids */ 211, /* (35) cmd ::= ALTER USER ids PASS ids */
{ 212, -3 }, /* (32) cmd ::= DROP ACCOUNT ids */ 211, /* (36) cmd ::= ALTER USER ids PRIVILEGE ids */
{ 212, -2 }, /* (33) cmd ::= USE ids */ 211, /* (37) cmd ::= ALTER DNODE ids ids */
{ 212, -3 }, /* (34) cmd ::= DESCRIBE ids cpxName */ 211, /* (38) cmd ::= ALTER DNODE ids ids ids */
{ 212, -5 }, /* (35) cmd ::= ALTER USER ids PASS ids */ 211, /* (39) cmd ::= ALTER LOCAL ids */
{ 212, -5 }, /* (36) cmd ::= ALTER USER ids PRIVILEGE ids */ 211, /* (40) cmd ::= ALTER LOCAL ids ids */
{ 212, -4 }, /* (37) cmd ::= ALTER DNODE ids ids */ 211, /* (41) cmd ::= ALTER DATABASE ids alter_db_optr */
{ 212, -5 }, /* (38) cmd ::= ALTER DNODE ids ids ids */ 211, /* (42) cmd ::= ALTER ACCOUNT ids acct_optr */
{ 212, -3 }, /* (39) cmd ::= ALTER LOCAL ids */ 211, /* (43) cmd ::= ALTER ACCOUNT ids PASS ids acct_optr */
{ 212, -4 }, /* (40) cmd ::= ALTER LOCAL ids ids */ 213, /* (44) ids ::= ID */
{ 212, -4 }, /* (41) cmd ::= ALTER DATABASE ids alter_db_optr */ 213, /* (45) ids ::= STRING */
{ 212, -4 }, /* (42) cmd ::= ALTER ACCOUNT ids acct_optr */ 215, /* (46) ifexists ::= IF EXISTS */
{ 212, -6 }, /* (43) cmd ::= ALTER ACCOUNT ids PASS ids acct_optr */ 215, /* (47) ifexists ::= */
{ 214, -1 }, /* (44) ids ::= ID */ 218, /* (48) ifnotexists ::= IF NOT EXISTS */
{ 214, -1 }, /* (45) ids ::= STRING */ 218, /* (49) ifnotexists ::= */
{ 216, -2 }, /* (46) ifexists ::= IF EXISTS */ 211, /* (50) cmd ::= CREATE DNODE ids */
{ 216, 0 }, /* (47) ifexists ::= */ 211, /* (51) cmd ::= CREATE ACCOUNT ids PASS ids acct_optr */
{ 219, -3 }, /* (48) ifnotexists ::= IF NOT EXISTS */ 211, /* (52) cmd ::= CREATE DATABASE ifnotexists ids db_optr */
{ 219, 0 }, /* (49) ifnotexists ::= */ 211, /* (53) cmd ::= CREATE USER ids PASS ids */
{ 212, -3 }, /* (50) cmd ::= CREATE DNODE ids */ 220, /* (54) pps ::= */
{ 212, -6 }, /* (51) cmd ::= CREATE ACCOUNT ids PASS ids acct_optr */ 220, /* (55) pps ::= PPS INTEGER */
{ 212, -5 }, /* (52) cmd ::= CREATE DATABASE ifnotexists ids db_optr */ 221, /* (56) tseries ::= */
{ 212, -5 }, /* (53) cmd ::= CREATE USER ids PASS ids */ 221, /* (57) tseries ::= TSERIES INTEGER */
{ 221, 0 }, /* (54) pps ::= */ 222, /* (58) dbs ::= */
{ 221, -2 }, /* (55) pps ::= PPS INTEGER */ 222, /* (59) dbs ::= DBS INTEGER */
{ 222, 0 }, /* (56) tseries ::= */ 223, /* (60) streams ::= */
{ 222, -2 }, /* (57) tseries ::= TSERIES INTEGER */ 223, /* (61) streams ::= STREAMS INTEGER */
{ 223, 0 }, /* (58) dbs ::= */ 224, /* (62) storage ::= */
{ 223, -2 }, /* (59) dbs ::= DBS INTEGER */ 224, /* (63) storage ::= STORAGE INTEGER */
{ 224, 0 }, /* (60) streams ::= */ 225, /* (64) qtime ::= */
{ 224, -2 }, /* (61) streams ::= STREAMS INTEGER */ 225, /* (65) qtime ::= QTIME INTEGER */
{ 225, 0 }, /* (62) storage ::= */ 226, /* (66) users ::= */
{ 225, -2 }, /* (63) storage ::= STORAGE INTEGER */ 226, /* (67) users ::= USERS INTEGER */
{ 226, 0 }, /* (64) qtime ::= */ 227, /* (68) conns ::= */
{ 226, -2 }, /* (65) qtime ::= QTIME INTEGER */ 227, /* (69) conns ::= CONNS INTEGER */
{ 227, 0 }, /* (66) users ::= */ 228, /* (70) state ::= */
{ 227, -2 }, /* (67) users ::= USERS INTEGER */ 228, /* (71) state ::= STATE ids */
{ 228, 0 }, /* (68) conns ::= */ 217, /* (72) acct_optr ::= pps tseries storage streams qtime dbs users conns state */
{ 228, -2 }, /* (69) conns ::= CONNS INTEGER */ 229, /* (73) keep ::= KEEP tagitemlist */
{ 229, 0 }, /* (70) state ::= */ 231, /* (74) cache ::= CACHE INTEGER */
{ 229, -2 }, /* (71) state ::= STATE ids */ 232, /* (75) replica ::= REPLICA INTEGER */
{ 218, -9 }, /* (72) acct_optr ::= pps tseries storage streams qtime dbs users conns state */ 233, /* (76) quorum ::= QUORUM INTEGER */
{ 230, -2 }, /* (73) keep ::= KEEP tagitemlist */ 234, /* (77) days ::= DAYS INTEGER */
{ 232, -2 }, /* (74) cache ::= CACHE INTEGER */ 235, /* (78) minrows ::= MINROWS INTEGER */
{ 233, -2 }, /* (75) replica ::= REPLICA INTEGER */ 236, /* (79) maxrows ::= MAXROWS INTEGER */
{ 234, -2 }, /* (76) quorum ::= QUORUM INTEGER */ 237, /* (80) blocks ::= BLOCKS INTEGER */
{ 235, -2 }, /* (77) days ::= DAYS INTEGER */ 238, /* (81) ctime ::= CTIME INTEGER */
{ 236, -2 }, /* (78) minrows ::= MINROWS INTEGER */ 239, /* (82) wal ::= WAL INTEGER */
{ 237, -2 }, /* (79) maxrows ::= MAXROWS INTEGER */ 240, /* (83) fsync ::= FSYNC INTEGER */
{ 238, -2 }, /* (80) blocks ::= BLOCKS INTEGER */ 241, /* (84) comp ::= COMP INTEGER */
{ 239, -2 }, /* (81) ctime ::= CTIME INTEGER */ 242, /* (85) prec ::= PRECISION STRING */
{ 240, -2 }, /* (82) wal ::= WAL INTEGER */ 243, /* (86) update ::= UPDATE INTEGER */
{ 241, -2 }, /* (83) fsync ::= FSYNC INTEGER */ 244, /* (87) cachelast ::= CACHELAST INTEGER */
{ 242, -2 }, /* (84) comp ::= COMP INTEGER */ 219, /* (88) db_optr ::= */
{ 243, -2 }, /* (85) prec ::= PRECISION STRING */ 219, /* (89) db_optr ::= db_optr cache */
{ 244, -2 }, /* (86) update ::= UPDATE INTEGER */ 219, /* (90) db_optr ::= db_optr replica */
{ 245, -2 }, /* (87) cachelast ::= CACHELAST INTEGER */ 219, /* (91) db_optr ::= db_optr quorum */
{ 220, 0 }, /* (88) db_optr ::= */ 219, /* (92) db_optr ::= db_optr days */
{ 220, -2 }, /* (89) db_optr ::= db_optr cache */ 219, /* (93) db_optr ::= db_optr minrows */
{ 220, -2 }, /* (90) db_optr ::= db_optr replica */ 219, /* (94) db_optr ::= db_optr maxrows */
{ 220, -2 }, /* (91) db_optr ::= db_optr quorum */ 219, /* (95) db_optr ::= db_optr blocks */
{ 220, -2 }, /* (92) db_optr ::= db_optr days */ 219, /* (96) db_optr ::= db_optr ctime */
{ 220, -2 }, /* (93) db_optr ::= db_optr minrows */ 219, /* (97) db_optr ::= db_optr wal */
{ 220, -2 }, /* (94) db_optr ::= db_optr maxrows */ 219, /* (98) db_optr ::= db_optr fsync */
{ 220, -2 }, /* (95) db_optr ::= db_optr blocks */ 219, /* (99) db_optr ::= db_optr comp */
{ 220, -2 }, /* (96) db_optr ::= db_optr ctime */ 219, /* (100) db_optr ::= db_optr prec */
{ 220, -2 }, /* (97) db_optr ::= db_optr wal */ 219, /* (101) db_optr ::= db_optr keep */
{ 220, -2 }, /* (98) db_optr ::= db_optr fsync */ 219, /* (102) db_optr ::= db_optr update */
{ 220, -2 }, /* (99) db_optr ::= db_optr comp */ 219, /* (103) db_optr ::= db_optr cachelast */
{ 220, -2 }, /* (100) db_optr ::= db_optr prec */ 216, /* (104) alter_db_optr ::= */
{ 220, -2 }, /* (101) db_optr ::= db_optr keep */ 216, /* (105) alter_db_optr ::= alter_db_optr replica */
{ 220, -2 }, /* (102) db_optr ::= db_optr update */ 216, /* (106) alter_db_optr ::= alter_db_optr quorum */
{ 220, -2 }, /* (103) db_optr ::= db_optr cachelast */ 216, /* (107) alter_db_optr ::= alter_db_optr keep */
{ 217, 0 }, /* (104) alter_db_optr ::= */ 216, /* (108) alter_db_optr ::= alter_db_optr blocks */
{ 217, -2 }, /* (105) alter_db_optr ::= alter_db_optr replica */ 216, /* (109) alter_db_optr ::= alter_db_optr comp */
{ 217, -2 }, /* (106) alter_db_optr ::= alter_db_optr quorum */ 216, /* (110) alter_db_optr ::= alter_db_optr wal */
{ 217, -2 }, /* (107) alter_db_optr ::= alter_db_optr keep */ 216, /* (111) alter_db_optr ::= alter_db_optr fsync */
{ 217, -2 }, /* (108) alter_db_optr ::= alter_db_optr blocks */ 216, /* (112) alter_db_optr ::= alter_db_optr update */
{ 217, -2 }, /* (109) alter_db_optr ::= alter_db_optr comp */ 216, /* (113) alter_db_optr ::= alter_db_optr cachelast */
{ 217, -2 }, /* (110) alter_db_optr ::= alter_db_optr wal */ 245, /* (114) typename ::= ids */
{ 217, -2 }, /* (111) alter_db_optr ::= alter_db_optr fsync */ 245, /* (115) typename ::= ids LP signed RP */
{ 217, -2 }, /* (112) alter_db_optr ::= alter_db_optr update */ 245, /* (116) typename ::= ids UNSIGNED */
{ 217, -2 }, /* (113) alter_db_optr ::= alter_db_optr cachelast */ 246, /* (117) signed ::= INTEGER */
{ 246, -1 }, /* (114) typename ::= ids */ 246, /* (118) signed ::= PLUS INTEGER */
{ 246, -4 }, /* (115) typename ::= ids LP signed RP */ 246, /* (119) signed ::= MINUS INTEGER */
{ 246, -2 }, /* (116) typename ::= ids UNSIGNED */ 211, /* (120) cmd ::= CREATE TABLE create_table_args */
{ 247, -1 }, /* (117) signed ::= INTEGER */ 211, /* (121) cmd ::= CREATE TABLE create_stable_args */
{ 247, -2 }, /* (118) signed ::= PLUS INTEGER */ 211, /* (122) cmd ::= CREATE STABLE create_stable_args */
{ 247, -2 }, /* (119) signed ::= MINUS INTEGER */ 211, /* (123) cmd ::= CREATE TABLE create_table_list */
{ 212, -3 }, /* (120) cmd ::= CREATE TABLE create_table_args */ 249, /* (124) create_table_list ::= create_from_stable */
{ 212, -3 }, /* (121) cmd ::= CREATE TABLE create_stable_args */ 249, /* (125) create_table_list ::= create_table_list create_from_stable */
{ 212, -3 }, /* (122) cmd ::= CREATE STABLE create_stable_args */ 247, /* (126) create_table_args ::= ifnotexists ids cpxName LP columnlist RP */
{ 212, -3 }, /* (123) cmd ::= CREATE TABLE create_table_list */ 248, /* (127) create_stable_args ::= ifnotexists ids cpxName LP columnlist RP TAGS LP columnlist RP */
{ 250, -1 }, /* (124) create_table_list ::= create_from_stable */ 250, /* (128) create_from_stable ::= ifnotexists ids cpxName USING ids cpxName TAGS LP tagitemlist RP */
{ 250, -2 }, /* (125) create_table_list ::= create_table_list create_from_stable */ 250, /* (129) create_from_stable ::= ifnotexists ids cpxName USING ids cpxName LP tagNamelist RP TAGS LP tagitemlist RP */
{ 248, -6 }, /* (126) create_table_args ::= ifnotexists ids cpxName LP columnlist RP */ 252, /* (130) tagNamelist ::= tagNamelist COMMA ids */
{ 249, -10 }, /* (127) create_stable_args ::= ifnotexists ids cpxName LP columnlist RP TAGS LP columnlist RP */ 252, /* (131) tagNamelist ::= ids */
{ 251, -10 }, /* (128) create_from_stable ::= ifnotexists ids cpxName USING ids cpxName TAGS LP tagitemlist RP */ 247, /* (132) create_table_args ::= ifnotexists ids cpxName AS select */
{ 248, -5 }, /* (129) create_table_args ::= ifnotexists ids cpxName AS select */ 251, /* (133) columnlist ::= columnlist COMMA column */
{ 252, -3 }, /* (130) columnlist ::= columnlist COMMA column */ 251, /* (134) columnlist ::= column */
{ 252, -1 }, /* (131) columnlist ::= column */ 254, /* (135) column ::= ids typename */
{ 254, -2 }, /* (132) column ::= ids typename */ 230, /* (136) tagitemlist ::= tagitemlist COMMA tagitem */
{ 231, -3 }, /* (133) tagitemlist ::= tagitemlist COMMA tagitem */ 230, /* (137) tagitemlist ::= tagitem */
{ 231, -1 }, /* (134) tagitemlist ::= tagitem */ 255, /* (138) tagitem ::= INTEGER */
{ 255, -1 }, /* (135) tagitem ::= INTEGER */ 255, /* (139) tagitem ::= FLOAT */
{ 255, -1 }, /* (136) tagitem ::= FLOAT */ 255, /* (140) tagitem ::= STRING */
{ 255, -1 }, /* (137) tagitem ::= STRING */ 255, /* (141) tagitem ::= BOOL */
{ 255, -1 }, /* (138) tagitem ::= BOOL */ 255, /* (142) tagitem ::= NULL */
{ 255, -1 }, /* (139) tagitem ::= NULL */ 255, /* (143) tagitem ::= MINUS INTEGER */
{ 255, -2 }, /* (140) tagitem ::= MINUS INTEGER */ 255, /* (144) tagitem ::= MINUS FLOAT */
{ 255, -2 }, /* (141) tagitem ::= MINUS FLOAT */ 255, /* (145) tagitem ::= PLUS INTEGER */
{ 255, -2 }, /* (142) tagitem ::= PLUS INTEGER */ 255, /* (146) tagitem ::= PLUS FLOAT */
{ 255, -2 }, /* (143) tagitem ::= PLUS FLOAT */ 253, /* (147) select ::= SELECT selcollist from where_opt interval_opt fill_opt sliding_opt groupby_opt orderby_opt having_opt slimit_opt limit_opt */
{ 253, -12 }, /* (144) select ::= SELECT selcollist from where_opt interval_opt fill_opt sliding_opt groupby_opt orderby_opt having_opt slimit_opt limit_opt */ 267, /* (148) union ::= select */
{ 267, -1 }, /* (145) union ::= select */ 267, /* (149) union ::= LP union RP */
{ 267, -3 }, /* (146) union ::= LP union RP */ 267, /* (150) union ::= union UNION ALL select */
{ 267, -4 }, /* (147) union ::= union UNION ALL select */ 267, /* (151) union ::= union UNION ALL LP select RP */
{ 267, -6 }, /* (148) union ::= union UNION ALL LP select RP */ 211, /* (152) cmd ::= union */
{ 212, -1 }, /* (149) cmd ::= union */ 253, /* (153) select ::= SELECT selcollist */
{ 253, -2 }, /* (150) select ::= SELECT selcollist */ 268, /* (154) sclp ::= selcollist COMMA */
{ 268, -2 }, /* (151) sclp ::= selcollist COMMA */ 268, /* (155) sclp ::= */
{ 268, 0 }, /* (152) sclp ::= */ 256, /* (156) selcollist ::= sclp distinct expr as */
{ 256, -4 }, /* (153) selcollist ::= sclp distinct expr as */ 256, /* (157) selcollist ::= sclp STAR */
{ 256, -2 }, /* (154) selcollist ::= sclp STAR */ 271, /* (158) as ::= AS ids */
{ 271, -2 }, /* (155) as ::= AS ids */ 271, /* (159) as ::= ids */
{ 271, -1 }, /* (156) as ::= ids */ 271, /* (160) as ::= */
{ 271, 0 }, /* (157) as ::= */ 269, /* (161) distinct ::= DISTINCT */
{ 269, -1 }, /* (158) distinct ::= DISTINCT */ 269, /* (162) distinct ::= */
{ 269, 0 }, /* (159) distinct ::= */ 257, /* (163) from ::= FROM tablelist */
{ 257, -2 }, /* (160) from ::= FROM tablelist */ 272, /* (164) tablelist ::= ids cpxName */
{ 272, -2 }, /* (161) tablelist ::= ids cpxName */ 272, /* (165) tablelist ::= ids cpxName ids */
{ 272, -3 }, /* (162) tablelist ::= ids cpxName ids */ 272, /* (166) tablelist ::= tablelist COMMA ids cpxName */
{ 272, -4 }, /* (163) tablelist ::= tablelist COMMA ids cpxName */ 272, /* (167) tablelist ::= tablelist COMMA ids cpxName ids */
{ 272, -5 }, /* (164) tablelist ::= tablelist COMMA ids cpxName ids */ 273, /* (168) tmvar ::= VARIABLE */
{ 273, -1 }, /* (165) tmvar ::= VARIABLE */ 259, /* (169) interval_opt ::= INTERVAL LP tmvar RP */
{ 259, -4 }, /* (166) interval_opt ::= INTERVAL LP tmvar RP */ 259, /* (170) interval_opt ::= INTERVAL LP tmvar COMMA tmvar RP */
{ 259, -6 }, /* (167) interval_opt ::= INTERVAL LP tmvar COMMA tmvar RP */ 259, /* (171) interval_opt ::= */
{ 259, 0 }, /* (168) interval_opt ::= */ 260, /* (172) fill_opt ::= */
{ 260, 0 }, /* (169) fill_opt ::= */ 260, /* (173) fill_opt ::= FILL LP ID COMMA tagitemlist RP */
{ 260, -6 }, /* (170) fill_opt ::= FILL LP ID COMMA tagitemlist RP */ 260, /* (174) fill_opt ::= FILL LP ID RP */
{ 260, -4 }, /* (171) fill_opt ::= FILL LP ID RP */ 261, /* (175) sliding_opt ::= SLIDING LP tmvar RP */
{ 261, -4 }, /* (172) sliding_opt ::= SLIDING LP tmvar RP */ 261, /* (176) sliding_opt ::= */
{ 261, 0 }, /* (173) sliding_opt ::= */ 263, /* (177) orderby_opt ::= */
{ 263, 0 }, /* (174) orderby_opt ::= */ 263, /* (178) orderby_opt ::= ORDER BY sortlist */
{ 263, -3 }, /* (175) orderby_opt ::= ORDER BY sortlist */ 274, /* (179) sortlist ::= sortlist COMMA item sortorder */
{ 274, -4 }, /* (176) sortlist ::= sortlist COMMA item sortorder */ 274, /* (180) sortlist ::= item sortorder */
{ 274, -2 }, /* (177) sortlist ::= item sortorder */ 276, /* (181) item ::= ids cpxName */
{ 276, -2 }, /* (178) item ::= ids cpxName */ 277, /* (182) sortorder ::= ASC */
{ 277, -1 }, /* (179) sortorder ::= ASC */ 277, /* (183) sortorder ::= DESC */
{ 277, -1 }, /* (180) sortorder ::= DESC */ 277, /* (184) sortorder ::= */
{ 277, 0 }, /* (181) sortorder ::= */ 262, /* (185) groupby_opt ::= */
{ 262, 0 }, /* (182) groupby_opt ::= */ 262, /* (186) groupby_opt ::= GROUP BY grouplist */
{ 262, -3 }, /* (183) groupby_opt ::= GROUP BY grouplist */ 278, /* (187) grouplist ::= grouplist COMMA item */
{ 278, -3 }, /* (184) grouplist ::= grouplist COMMA item */ 278, /* (188) grouplist ::= item */
{ 278, -1 }, /* (185) grouplist ::= item */ 264, /* (189) having_opt ::= */
{ 264, 0 }, /* (186) having_opt ::= */ 264, /* (190) having_opt ::= HAVING expr */
{ 264, -2 }, /* (187) having_opt ::= HAVING expr */ 266, /* (191) limit_opt ::= */
{ 266, 0 }, /* (188) limit_opt ::= */ 266, /* (192) limit_opt ::= LIMIT signed */
{ 266, -2 }, /* (189) limit_opt ::= LIMIT signed */ 266, /* (193) limit_opt ::= LIMIT signed OFFSET signed */
{ 266, -4 }, /* (190) limit_opt ::= LIMIT signed OFFSET signed */ 266, /* (194) limit_opt ::= LIMIT signed COMMA signed */
{ 266, -4 }, /* (191) limit_opt ::= LIMIT signed COMMA signed */ 265, /* (195) slimit_opt ::= */
{ 265, 0 }, /* (192) slimit_opt ::= */ 265, /* (196) slimit_opt ::= SLIMIT signed */
{ 265, -2 }, /* (193) slimit_opt ::= SLIMIT signed */ 265, /* (197) slimit_opt ::= SLIMIT signed SOFFSET signed */
{ 265, -4 }, /* (194) slimit_opt ::= SLIMIT signed SOFFSET signed */ 265, /* (198) slimit_opt ::= SLIMIT signed COMMA signed */
{ 265, -4 }, /* (195) slimit_opt ::= SLIMIT signed COMMA signed */ 258, /* (199) where_opt ::= */
{ 258, 0 }, /* (196) where_opt ::= */ 258, /* (200) where_opt ::= WHERE expr */
{ 258, -2 }, /* (197) where_opt ::= WHERE expr */ 270, /* (201) expr ::= LP expr RP */
{ 270, -3 }, /* (198) expr ::= LP expr RP */ 270, /* (202) expr ::= ID */
{ 270, -1 }, /* (199) expr ::= ID */ 270, /* (203) expr ::= ID DOT ID */
{ 270, -3 }, /* (200) expr ::= ID DOT ID */ 270, /* (204) expr ::= ID DOT STAR */
{ 270, -3 }, /* (201) expr ::= ID DOT STAR */ 270, /* (205) expr ::= INTEGER */
{ 270, -1 }, /* (202) expr ::= INTEGER */ 270, /* (206) expr ::= MINUS INTEGER */
{ 270, -2 }, /* (203) expr ::= MINUS INTEGER */ 270, /* (207) expr ::= PLUS INTEGER */
{ 270, -2 }, /* (204) expr ::= PLUS INTEGER */ 270, /* (208) expr ::= FLOAT */
{ 270, -1 }, /* (205) expr ::= FLOAT */ 270, /* (209) expr ::= MINUS FLOAT */
{ 270, -2 }, /* (206) expr ::= MINUS FLOAT */ 270, /* (210) expr ::= PLUS FLOAT */
{ 270, -2 }, /* (207) expr ::= PLUS FLOAT */ 270, /* (211) expr ::= STRING */
{ 270, -1 }, /* (208) expr ::= STRING */ 270, /* (212) expr ::= NOW */
{ 270, -1 }, /* (209) expr ::= NOW */ 270, /* (213) expr ::= VARIABLE */
{ 270, -1 }, /* (210) expr ::= VARIABLE */ 270, /* (214) expr ::= BOOL */
{ 270, -1 }, /* (211) expr ::= BOOL */ 270, /* (215) expr ::= ID LP exprlist RP */
{ 270, -4 }, /* (212) expr ::= ID LP exprlist RP */ 270, /* (216) expr ::= ID LP STAR RP */
{ 270, -4 }, /* (213) expr ::= ID LP STAR RP */ 270, /* (217) expr ::= expr IS NULL */
{ 270, -3 }, /* (214) expr ::= expr IS NULL */ 270, /* (218) expr ::= expr IS NOT NULL */
{ 270, -4 }, /* (215) expr ::= expr IS NOT NULL */ 270, /* (219) expr ::= expr LT expr */
{ 270, -3 }, /* (216) expr ::= expr LT expr */ 270, /* (220) expr ::= expr GT expr */
{ 270, -3 }, /* (217) expr ::= expr GT expr */ 270, /* (221) expr ::= expr LE expr */
{ 270, -3 }, /* (218) expr ::= expr LE expr */ 270, /* (222) expr ::= expr GE expr */
{ 270, -3 }, /* (219) expr ::= expr GE expr */ 270, /* (223) expr ::= expr NE expr */
{ 270, -3 }, /* (220) expr ::= expr NE expr */ 270, /* (224) expr ::= expr EQ expr */
{ 270, -3 }, /* (221) expr ::= expr EQ expr */ 270, /* (225) expr ::= expr AND expr */
{ 270, -3 }, /* (222) expr ::= expr AND expr */ 270, /* (226) expr ::= expr OR expr */
{ 270, -3 }, /* (223) expr ::= expr OR expr */ 270, /* (227) expr ::= expr PLUS expr */
{ 270, -3 }, /* (224) expr ::= expr PLUS expr */ 270, /* (228) expr ::= expr MINUS expr */
{ 270, -3 }, /* (225) expr ::= expr MINUS expr */ 270, /* (229) expr ::= expr STAR expr */
{ 270, -3 }, /* (226) expr ::= expr STAR expr */ 270, /* (230) expr ::= expr SLASH expr */
{ 270, -3 }, /* (227) expr ::= expr SLASH expr */ 270, /* (231) expr ::= expr REM expr */
{ 270, -3 }, /* (228) expr ::= expr REM expr */ 270, /* (232) expr ::= expr LIKE expr */
{ 270, -3 }, /* (229) expr ::= expr LIKE expr */ 270, /* (233) expr ::= expr IN LP exprlist RP */
{ 270, -5 }, /* (230) expr ::= expr IN LP exprlist RP */ 279, /* (234) exprlist ::= exprlist COMMA expritem */
{ 279, -3 }, /* (231) exprlist ::= exprlist COMMA expritem */ 279, /* (235) exprlist ::= expritem */
{ 279, -1 }, /* (232) exprlist ::= expritem */ 280, /* (236) expritem ::= expr */
{ 280, -1 }, /* (233) expritem ::= expr */ 280, /* (237) expritem ::= */
{ 280, 0 }, /* (234) expritem ::= */ 211, /* (238) cmd ::= RESET QUERY CACHE */
{ 212, -3 }, /* (235) cmd ::= RESET QUERY CACHE */ 211, /* (239) cmd ::= ALTER TABLE ids cpxName ADD COLUMN columnlist */
{ 212, -7 }, /* (236) cmd ::= ALTER TABLE ids cpxName ADD COLUMN columnlist */ 211, /* (240) cmd ::= ALTER TABLE ids cpxName DROP COLUMN ids */
{ 212, -7 }, /* (237) cmd ::= ALTER TABLE ids cpxName DROP COLUMN ids */ 211, /* (241) cmd ::= ALTER TABLE ids cpxName ADD TAG columnlist */
{ 212, -7 }, /* (238) cmd ::= ALTER TABLE ids cpxName ADD TAG columnlist */ 211, /* (242) cmd ::= ALTER TABLE ids cpxName DROP TAG ids */
{ 212, -7 }, /* (239) cmd ::= ALTER TABLE ids cpxName DROP TAG ids */ 211, /* (243) cmd ::= ALTER TABLE ids cpxName CHANGE TAG ids ids */
{ 212, -8 }, /* (240) cmd ::= ALTER TABLE ids cpxName CHANGE TAG ids ids */ 211, /* (244) cmd ::= ALTER TABLE ids cpxName SET TAG ids EQ tagitem */
{ 212, -9 }, /* (241) cmd ::= ALTER TABLE ids cpxName SET TAG ids EQ tagitem */ 211, /* (245) cmd ::= ALTER STABLE ids cpxName ADD COLUMN columnlist */
{ 212, -7 }, /* (242) cmd ::= ALTER STABLE ids cpxName ADD COLUMN columnlist */ 211, /* (246) cmd ::= ALTER STABLE ids cpxName DROP COLUMN ids */
{ 212, -7 }, /* (243) cmd ::= ALTER STABLE ids cpxName DROP COLUMN ids */ 211, /* (247) cmd ::= ALTER STABLE ids cpxName ADD TAG columnlist */
{ 212, -7 }, /* (244) cmd ::= ALTER STABLE ids cpxName ADD TAG columnlist */ 211, /* (248) cmd ::= ALTER STABLE ids cpxName DROP TAG ids */
{ 212, -7 }, /* (245) cmd ::= ALTER STABLE ids cpxName DROP TAG ids */ 211, /* (249) cmd ::= ALTER STABLE ids cpxName CHANGE TAG ids ids */
{ 212, -8 }, /* (246) cmd ::= ALTER STABLE ids cpxName CHANGE TAG ids ids */ 211, /* (250) cmd ::= KILL CONNECTION INTEGER */
{ 212, -3 }, /* (247) cmd ::= KILL CONNECTION INTEGER */ 211, /* (251) cmd ::= KILL STREAM INTEGER COLON INTEGER */
{ 212, -5 }, /* (248) cmd ::= KILL STREAM INTEGER COLON INTEGER */ 211, /* (252) cmd ::= KILL QUERY INTEGER COLON INTEGER */
{ 212, -5 }, /* (249) cmd ::= KILL QUERY INTEGER COLON INTEGER */ };
/* For rule J, yyRuleInfoNRhs[J] contains the negative of the number
** of symbols on the right-hand side of that rule. */
static const signed char yyRuleInfoNRhs[] = {
-1, /* (0) program ::= cmd */
-2, /* (1) cmd ::= SHOW DATABASES */
-2, /* (2) cmd ::= SHOW MNODES */
-2, /* (3) cmd ::= SHOW DNODES */
-2, /* (4) cmd ::= SHOW ACCOUNTS */
-2, /* (5) cmd ::= SHOW USERS */
-2, /* (6) cmd ::= SHOW MODULES */
-2, /* (7) cmd ::= SHOW QUERIES */
-2, /* (8) cmd ::= SHOW CONNECTIONS */
-2, /* (9) cmd ::= SHOW STREAMS */
-2, /* (10) cmd ::= SHOW VARIABLES */
-2, /* (11) cmd ::= SHOW SCORES */
-2, /* (12) cmd ::= SHOW GRANTS */
-2, /* (13) cmd ::= SHOW VNODES */
-3, /* (14) cmd ::= SHOW VNODES IPTOKEN */
0, /* (15) dbPrefix ::= */
-2, /* (16) dbPrefix ::= ids DOT */
0, /* (17) cpxName ::= */
-2, /* (18) cpxName ::= DOT ids */
-5, /* (19) cmd ::= SHOW CREATE TABLE ids cpxName */
-4, /* (20) cmd ::= SHOW CREATE DATABASE ids */
-3, /* (21) cmd ::= SHOW dbPrefix TABLES */
-5, /* (22) cmd ::= SHOW dbPrefix TABLES LIKE ids */
-3, /* (23) cmd ::= SHOW dbPrefix STABLES */
-5, /* (24) cmd ::= SHOW dbPrefix STABLES LIKE ids */
-3, /* (25) cmd ::= SHOW dbPrefix VGROUPS */
-4, /* (26) cmd ::= SHOW dbPrefix VGROUPS ids */
-5, /* (27) cmd ::= DROP TABLE ifexists ids cpxName */
-5, /* (28) cmd ::= DROP STABLE ifexists ids cpxName */
-4, /* (29) cmd ::= DROP DATABASE ifexists ids */
-3, /* (30) cmd ::= DROP DNODE ids */
-3, /* (31) cmd ::= DROP USER ids */
-3, /* (32) cmd ::= DROP ACCOUNT ids */
-2, /* (33) cmd ::= USE ids */
-3, /* (34) cmd ::= DESCRIBE ids cpxName */
-5, /* (35) cmd ::= ALTER USER ids PASS ids */
-5, /* (36) cmd ::= ALTER USER ids PRIVILEGE ids */
-4, /* (37) cmd ::= ALTER DNODE ids ids */
-5, /* (38) cmd ::= ALTER DNODE ids ids ids */
-3, /* (39) cmd ::= ALTER LOCAL ids */
-4, /* (40) cmd ::= ALTER LOCAL ids ids */
-4, /* (41) cmd ::= ALTER DATABASE ids alter_db_optr */
-4, /* (42) cmd ::= ALTER ACCOUNT ids acct_optr */
-6, /* (43) cmd ::= ALTER ACCOUNT ids PASS ids acct_optr */
-1, /* (44) ids ::= ID */
-1, /* (45) ids ::= STRING */
-2, /* (46) ifexists ::= IF EXISTS */
0, /* (47) ifexists ::= */
-3, /* (48) ifnotexists ::= IF NOT EXISTS */
0, /* (49) ifnotexists ::= */
-3, /* (50) cmd ::= CREATE DNODE ids */
-6, /* (51) cmd ::= CREATE ACCOUNT ids PASS ids acct_optr */
-5, /* (52) cmd ::= CREATE DATABASE ifnotexists ids db_optr */
-5, /* (53) cmd ::= CREATE USER ids PASS ids */
0, /* (54) pps ::= */
-2, /* (55) pps ::= PPS INTEGER */
0, /* (56) tseries ::= */
-2, /* (57) tseries ::= TSERIES INTEGER */
0, /* (58) dbs ::= */
-2, /* (59) dbs ::= DBS INTEGER */
0, /* (60) streams ::= */
-2, /* (61) streams ::= STREAMS INTEGER */
0, /* (62) storage ::= */
-2, /* (63) storage ::= STORAGE INTEGER */
0, /* (64) qtime ::= */
-2, /* (65) qtime ::= QTIME INTEGER */
0, /* (66) users ::= */
-2, /* (67) users ::= USERS INTEGER */
0, /* (68) conns ::= */
-2, /* (69) conns ::= CONNS INTEGER */
0, /* (70) state ::= */
-2, /* (71) state ::= STATE ids */
-9, /* (72) acct_optr ::= pps tseries storage streams qtime dbs users conns state */
-2, /* (73) keep ::= KEEP tagitemlist */
-2, /* (74) cache ::= CACHE INTEGER */
-2, /* (75) replica ::= REPLICA INTEGER */
-2, /* (76) quorum ::= QUORUM INTEGER */
-2, /* (77) days ::= DAYS INTEGER */
-2, /* (78) minrows ::= MINROWS INTEGER */
-2, /* (79) maxrows ::= MAXROWS INTEGER */
-2, /* (80) blocks ::= BLOCKS INTEGER */
-2, /* (81) ctime ::= CTIME INTEGER */
-2, /* (82) wal ::= WAL INTEGER */
-2, /* (83) fsync ::= FSYNC INTEGER */
-2, /* (84) comp ::= COMP INTEGER */
-2, /* (85) prec ::= PRECISION STRING */
-2, /* (86) update ::= UPDATE INTEGER */
-2, /* (87) cachelast ::= CACHELAST INTEGER */
0, /* (88) db_optr ::= */
-2, /* (89) db_optr ::= db_optr cache */
-2, /* (90) db_optr ::= db_optr replica */
-2, /* (91) db_optr ::= db_optr quorum */
-2, /* (92) db_optr ::= db_optr days */
-2, /* (93) db_optr ::= db_optr minrows */
-2, /* (94) db_optr ::= db_optr maxrows */
-2, /* (95) db_optr ::= db_optr blocks */
-2, /* (96) db_optr ::= db_optr ctime */
-2, /* (97) db_optr ::= db_optr wal */
-2, /* (98) db_optr ::= db_optr fsync */
-2, /* (99) db_optr ::= db_optr comp */
-2, /* (100) db_optr ::= db_optr prec */
-2, /* (101) db_optr ::= db_optr keep */
-2, /* (102) db_optr ::= db_optr update */
-2, /* (103) db_optr ::= db_optr cachelast */
0, /* (104) alter_db_optr ::= */
-2, /* (105) alter_db_optr ::= alter_db_optr replica */
-2, /* (106) alter_db_optr ::= alter_db_optr quorum */
-2, /* (107) alter_db_optr ::= alter_db_optr keep */
-2, /* (108) alter_db_optr ::= alter_db_optr blocks */
-2, /* (109) alter_db_optr ::= alter_db_optr comp */
-2, /* (110) alter_db_optr ::= alter_db_optr wal */
-2, /* (111) alter_db_optr ::= alter_db_optr fsync */
-2, /* (112) alter_db_optr ::= alter_db_optr update */
-2, /* (113) alter_db_optr ::= alter_db_optr cachelast */
-1, /* (114) typename ::= ids */
-4, /* (115) typename ::= ids LP signed RP */
-2, /* (116) typename ::= ids UNSIGNED */
-1, /* (117) signed ::= INTEGER */
-2, /* (118) signed ::= PLUS INTEGER */
-2, /* (119) signed ::= MINUS INTEGER */
-3, /* (120) cmd ::= CREATE TABLE create_table_args */
-3, /* (121) cmd ::= CREATE TABLE create_stable_args */
-3, /* (122) cmd ::= CREATE STABLE create_stable_args */
-3, /* (123) cmd ::= CREATE TABLE create_table_list */
-1, /* (124) create_table_list ::= create_from_stable */
-2, /* (125) create_table_list ::= create_table_list create_from_stable */
-6, /* (126) create_table_args ::= ifnotexists ids cpxName LP columnlist RP */
-10, /* (127) create_stable_args ::= ifnotexists ids cpxName LP columnlist RP TAGS LP columnlist RP */
-10, /* (128) create_from_stable ::= ifnotexists ids cpxName USING ids cpxName TAGS LP tagitemlist RP */
-13, /* (129) create_from_stable ::= ifnotexists ids cpxName USING ids cpxName LP tagNamelist RP TAGS LP tagitemlist RP */
-3, /* (130) tagNamelist ::= tagNamelist COMMA ids */
-1, /* (131) tagNamelist ::= ids */
-5, /* (132) create_table_args ::= ifnotexists ids cpxName AS select */
-3, /* (133) columnlist ::= columnlist COMMA column */
-1, /* (134) columnlist ::= column */
-2, /* (135) column ::= ids typename */
-3, /* (136) tagitemlist ::= tagitemlist COMMA tagitem */
-1, /* (137) tagitemlist ::= tagitem */
-1, /* (138) tagitem ::= INTEGER */
-1, /* (139) tagitem ::= FLOAT */
-1, /* (140) tagitem ::= STRING */
-1, /* (141) tagitem ::= BOOL */
-1, /* (142) tagitem ::= NULL */
-2, /* (143) tagitem ::= MINUS INTEGER */
-2, /* (144) tagitem ::= MINUS FLOAT */
-2, /* (145) tagitem ::= PLUS INTEGER */
-2, /* (146) tagitem ::= PLUS FLOAT */
-12, /* (147) select ::= SELECT selcollist from where_opt interval_opt fill_opt sliding_opt groupby_opt orderby_opt having_opt slimit_opt limit_opt */
-1, /* (148) union ::= select */
-3, /* (149) union ::= LP union RP */
-4, /* (150) union ::= union UNION ALL select */
-6, /* (151) union ::= union UNION ALL LP select RP */
-1, /* (152) cmd ::= union */
-2, /* (153) select ::= SELECT selcollist */
-2, /* (154) sclp ::= selcollist COMMA */
0, /* (155) sclp ::= */
-4, /* (156) selcollist ::= sclp distinct expr as */
-2, /* (157) selcollist ::= sclp STAR */
-2, /* (158) as ::= AS ids */
-1, /* (159) as ::= ids */
0, /* (160) as ::= */
-1, /* (161) distinct ::= DISTINCT */
0, /* (162) distinct ::= */
-2, /* (163) from ::= FROM tablelist */
-2, /* (164) tablelist ::= ids cpxName */
-3, /* (165) tablelist ::= ids cpxName ids */
-4, /* (166) tablelist ::= tablelist COMMA ids cpxName */
-5, /* (167) tablelist ::= tablelist COMMA ids cpxName ids */
-1, /* (168) tmvar ::= VARIABLE */
-4, /* (169) interval_opt ::= INTERVAL LP tmvar RP */
-6, /* (170) interval_opt ::= INTERVAL LP tmvar COMMA tmvar RP */
0, /* (171) interval_opt ::= */
0, /* (172) fill_opt ::= */
-6, /* (173) fill_opt ::= FILL LP ID COMMA tagitemlist RP */
-4, /* (174) fill_opt ::= FILL LP ID RP */
-4, /* (175) sliding_opt ::= SLIDING LP tmvar RP */
0, /* (176) sliding_opt ::= */
0, /* (177) orderby_opt ::= */
-3, /* (178) orderby_opt ::= ORDER BY sortlist */
-4, /* (179) sortlist ::= sortlist COMMA item sortorder */
-2, /* (180) sortlist ::= item sortorder */
-2, /* (181) item ::= ids cpxName */
-1, /* (182) sortorder ::= ASC */
-1, /* (183) sortorder ::= DESC */
0, /* (184) sortorder ::= */
0, /* (185) groupby_opt ::= */
-3, /* (186) groupby_opt ::= GROUP BY grouplist */
-3, /* (187) grouplist ::= grouplist COMMA item */
-1, /* (188) grouplist ::= item */
0, /* (189) having_opt ::= */
-2, /* (190) having_opt ::= HAVING expr */
0, /* (191) limit_opt ::= */
-2, /* (192) limit_opt ::= LIMIT signed */
-4, /* (193) limit_opt ::= LIMIT signed OFFSET signed */
-4, /* (194) limit_opt ::= LIMIT signed COMMA signed */
0, /* (195) slimit_opt ::= */
-2, /* (196) slimit_opt ::= SLIMIT signed */
-4, /* (197) slimit_opt ::= SLIMIT signed SOFFSET signed */
-4, /* (198) slimit_opt ::= SLIMIT signed COMMA signed */
0, /* (199) where_opt ::= */
-2, /* (200) where_opt ::= WHERE expr */
-3, /* (201) expr ::= LP expr RP */
-1, /* (202) expr ::= ID */
-3, /* (203) expr ::= ID DOT ID */
-3, /* (204) expr ::= ID DOT STAR */
-1, /* (205) expr ::= INTEGER */
-2, /* (206) expr ::= MINUS INTEGER */
-2, /* (207) expr ::= PLUS INTEGER */
-1, /* (208) expr ::= FLOAT */
-2, /* (209) expr ::= MINUS FLOAT */
-2, /* (210) expr ::= PLUS FLOAT */
-1, /* (211) expr ::= STRING */
-1, /* (212) expr ::= NOW */
-1, /* (213) expr ::= VARIABLE */
-1, /* (214) expr ::= BOOL */
-4, /* (215) expr ::= ID LP exprlist RP */
-4, /* (216) expr ::= ID LP STAR RP */
-3, /* (217) expr ::= expr IS NULL */
-4, /* (218) expr ::= expr IS NOT NULL */
-3, /* (219) expr ::= expr LT expr */
-3, /* (220) expr ::= expr GT expr */
-3, /* (221) expr ::= expr LE expr */
-3, /* (222) expr ::= expr GE expr */
-3, /* (223) expr ::= expr NE expr */
-3, /* (224) expr ::= expr EQ expr */
-3, /* (225) expr ::= expr AND expr */
-3, /* (226) expr ::= expr OR expr */
-3, /* (227) expr ::= expr PLUS expr */
-3, /* (228) expr ::= expr MINUS expr */
-3, /* (229) expr ::= expr STAR expr */
-3, /* (230) expr ::= expr SLASH expr */
-3, /* (231) expr ::= expr REM expr */
-3, /* (232) expr ::= expr LIKE expr */
-5, /* (233) expr ::= expr IN LP exprlist RP */
-3, /* (234) exprlist ::= exprlist COMMA expritem */
-1, /* (235) exprlist ::= expritem */
-1, /* (236) expritem ::= expr */
0, /* (237) expritem ::= */
-3, /* (238) cmd ::= RESET QUERY CACHE */
-7, /* (239) cmd ::= ALTER TABLE ids cpxName ADD COLUMN columnlist */
-7, /* (240) cmd ::= ALTER TABLE ids cpxName DROP COLUMN ids */
-7, /* (241) cmd ::= ALTER TABLE ids cpxName ADD TAG columnlist */
-7, /* (242) cmd ::= ALTER TABLE ids cpxName DROP TAG ids */
-8, /* (243) cmd ::= ALTER TABLE ids cpxName CHANGE TAG ids ids */
-9, /* (244) cmd ::= ALTER TABLE ids cpxName SET TAG ids EQ tagitem */
-7, /* (245) cmd ::= ALTER STABLE ids cpxName ADD COLUMN columnlist */
-7, /* (246) cmd ::= ALTER STABLE ids cpxName DROP COLUMN ids */
-7, /* (247) cmd ::= ALTER STABLE ids cpxName ADD TAG columnlist */
-7, /* (248) cmd ::= ALTER STABLE ids cpxName DROP TAG ids */
-8, /* (249) cmd ::= ALTER STABLE ids cpxName CHANGE TAG ids ids */
-3, /* (250) cmd ::= KILL CONNECTION INTEGER */
-5, /* (251) cmd ::= KILL STREAM INTEGER COLON INTEGER */
-5, /* (252) cmd ::= KILL QUERY INTEGER COLON INTEGER */
}; };
static void yy_accept(yyParser*); /* Forward Declaration */ static void yy_accept(yyParser*); /* Forward Declaration */
...@@ -2013,30 +2292,34 @@ static void yy_accept(yyParser*); /* Forward Declaration */ ...@@ -2013,30 +2292,34 @@ static void yy_accept(yyParser*); /* Forward Declaration */
** only called from one place, optimizing compilers will in-line it, which ** only called from one place, optimizing compilers will in-line it, which
** means that the extra parameters have no performance impact. ** means that the extra parameters have no performance impact.
*/ */
static void yy_reduce( static YYACTIONTYPE yy_reduce(
yyParser *yypParser, /* The parser */ yyParser *yypParser, /* The parser */
unsigned int yyruleno, /* Number of the rule by which to reduce */ unsigned int yyruleno, /* Number of the rule by which to reduce */
int yyLookahead, /* Lookahead token, or YYNOCODE if none */ int yyLookahead, /* Lookahead token, or YYNOCODE if none */
ParseTOKENTYPE yyLookaheadToken /* Value of the lookahead token */ ParseTOKENTYPE yyLookaheadToken /* Value of the lookahead token */
ParseCTX_PDECL /* %extra_context */
){ ){
int yygoto; /* The next state */ int yygoto; /* The next state */
int yyact; /* The next action */ YYACTIONTYPE yyact; /* The next action */
yyStackEntry *yymsp; /* The top of the parser's stack */ yyStackEntry *yymsp; /* The top of the parser's stack */
int yysize; /* Amount to pop the stack */ int yysize; /* Amount to pop the stack */
ParseARG_FETCH; ParseARG_FETCH
(void)yyLookahead; (void)yyLookahead;
(void)yyLookaheadToken; (void)yyLookaheadToken;
yymsp = yypParser->yytos; yymsp = yypParser->yytos;
#ifndef NDEBUG #ifndef NDEBUG
if( yyTraceFILE && yyruleno<(int)(sizeof(yyRuleName)/sizeof(yyRuleName[0])) ){ if( yyTraceFILE && yyruleno<(int)(sizeof(yyRuleName)/sizeof(yyRuleName[0])) ){
yysize = yyRuleInfo[yyruleno].nrhs; yysize = yyRuleInfoNRhs[yyruleno];
if( yysize ){ if( yysize ){
fprintf(yyTraceFILE, "%sReduce %d [%s], go to state %d.\n", fprintf(yyTraceFILE, "%sReduce %d [%s]%s, pop back to state %d.\n",
yyTracePrompt, yyTracePrompt,
yyruleno, yyRuleName[yyruleno], yymsp[yysize].stateno); yyruleno, yyRuleName[yyruleno],
yyruleno<YYNRULE_WITH_ACTION ? "" : " without external action",
yymsp[yysize].stateno);
}else{ }else{
fprintf(yyTraceFILE, "%sReduce %d [%s].\n", fprintf(yyTraceFILE, "%sReduce %d [%s]%s.\n",
yyTracePrompt, yyruleno, yyRuleName[yyruleno]); yyTracePrompt, yyruleno, yyRuleName[yyruleno],
yyruleno<YYNRULE_WITH_ACTION ? "" : " without external action");
} }
} }
#endif /* NDEBUG */ #endif /* NDEBUG */
...@@ -2044,7 +2327,7 @@ static void yy_reduce( ...@@ -2044,7 +2327,7 @@ static void yy_reduce(
/* Check that the stack is large enough to grow by a single entry /* Check that the stack is large enough to grow by a single entry
** if the RHS of the rule is empty. This ensures that there is room ** if the RHS of the rule is empty. This ensures that there is room
** enough on the stack to push the LHS value */ ** enough on the stack to push the LHS value */
if( yyRuleInfo[yyruleno].nrhs==0 ){ if( yyRuleInfoNRhs[yyruleno]==0 ){
#ifdef YYTRACKMAXSTACKDEPTH #ifdef YYTRACKMAXSTACKDEPTH
if( (int)(yypParser->yytos - yypParser->yystack)>yypParser->yyhwm ){ if( (int)(yypParser->yytos - yypParser->yystack)>yypParser->yyhwm ){
yypParser->yyhwm++; yypParser->yyhwm++;
...@@ -2054,13 +2337,19 @@ static void yy_reduce( ...@@ -2054,13 +2337,19 @@ static void yy_reduce(
#if YYSTACKDEPTH>0 #if YYSTACKDEPTH>0
if( yypParser->yytos>=yypParser->yystackEnd ){ if( yypParser->yytos>=yypParser->yystackEnd ){
yyStackOverflow(yypParser); yyStackOverflow(yypParser);
return; /* The call to yyStackOverflow() above pops the stack until it is
** empty, causing the main parser loop to exit. So the return value
** is never used and does not matter. */
return 0;
} }
#else #else
if( yypParser->yytos>=&yypParser->yystack[yypParser->yystksz-1] ){ if( yypParser->yytos>=&yypParser->yystack[yypParser->yystksz-1] ){
if( yyGrowStack(yypParser) ){ if( yyGrowStack(yypParser) ){
yyStackOverflow(yypParser); yyStackOverflow(yypParser);
return; /* The call to yyStackOverflow() above pops the stack until it is
** empty, causing the main parser loop to exit. So the return value
** is never used and does not matter. */
return 0;
} }
yymsp = yypParser->yytos; yymsp = yypParser->yytos;
} }
...@@ -2256,7 +2545,7 @@ static void yy_reduce( ...@@ -2256,7 +2545,7 @@ static void yy_reduce(
break; break;
case 47: /* ifexists ::= */ case 47: /* ifexists ::= */
case 49: /* ifnotexists ::= */ yytestcase(yyruleno==49); case 49: /* ifnotexists ::= */ yytestcase(yyruleno==49);
case 159: /* distinct ::= */ yytestcase(yyruleno==159); case 162: /* distinct ::= */ yytestcase(yyruleno==162);
{ yymsp[1].minor.yy0.n = 0;} { yymsp[1].minor.yy0.n = 0;}
break; break;
case 48: /* ifnotexists ::= IF NOT EXISTS */ case 48: /* ifnotexists ::= IF NOT EXISTS */
...@@ -2486,11 +2775,27 @@ static void yy_reduce( ...@@ -2486,11 +2775,27 @@ static void yy_reduce(
{ {
yymsp[-5].minor.yy0.n += yymsp[-4].minor.yy0.n; yymsp[-5].minor.yy0.n += yymsp[-4].minor.yy0.n;
yymsp[-8].minor.yy0.n += yymsp[-7].minor.yy0.n; yymsp[-8].minor.yy0.n += yymsp[-7].minor.yy0.n;
yylhsminor.yy42 = createNewChildTableInfo(&yymsp[-5].minor.yy0, yymsp[-1].minor.yy247, &yymsp[-8].minor.yy0, &yymsp[-9].minor.yy0); yylhsminor.yy42 = createNewChildTableInfo(&yymsp[-5].minor.yy0, NULL, yymsp[-1].minor.yy247, &yymsp[-8].minor.yy0, &yymsp[-9].minor.yy0);
} }
yymsp[-9].minor.yy42 = yylhsminor.yy42; yymsp[-9].minor.yy42 = yylhsminor.yy42;
break; break;
case 129: /* create_table_args ::= ifnotexists ids cpxName AS select */ case 129: /* create_from_stable ::= ifnotexists ids cpxName USING ids cpxName LP tagNamelist RP TAGS LP tagitemlist RP */
{
yymsp[-8].minor.yy0.n += yymsp[-7].minor.yy0.n;
yymsp[-11].minor.yy0.n += yymsp[-10].minor.yy0.n;
yylhsminor.yy42 = createNewChildTableInfo(&yymsp[-8].minor.yy0, yymsp[-5].minor.yy247, yymsp[-1].minor.yy247, &yymsp[-11].minor.yy0, &yymsp[-12].minor.yy0);
}
yymsp[-12].minor.yy42 = yylhsminor.yy42;
break;
case 130: /* tagNamelist ::= tagNamelist COMMA ids */
{taosArrayPush(yymsp[-2].minor.yy247, &yymsp[0].minor.yy0); yylhsminor.yy247 = yymsp[-2].minor.yy247; }
yymsp[-2].minor.yy247 = yylhsminor.yy247;
break;
case 131: /* tagNamelist ::= ids */
{yylhsminor.yy247 = taosArrayInit(4, sizeof(SStrToken)); taosArrayPush(yylhsminor.yy247, &yymsp[0].minor.yy0);}
yymsp[0].minor.yy247 = yylhsminor.yy247;
break;
case 132: /* create_table_args ::= ifnotexists ids cpxName AS select */
{ {
yylhsminor.yy358 = tSetCreateSqlElems(NULL, NULL, yymsp[0].minor.yy114, TSQL_CREATE_STREAM); yylhsminor.yy358 = tSetCreateSqlElems(NULL, NULL, yymsp[0].minor.yy114, TSQL_CREATE_STREAM);
setSqlInfo(pInfo, yylhsminor.yy358, NULL, TSDB_SQL_CREATE_TABLE); setSqlInfo(pInfo, yylhsminor.yy358, NULL, TSDB_SQL_CREATE_TABLE);
...@@ -2500,43 +2805,43 @@ static void yy_reduce( ...@@ -2500,43 +2805,43 @@ static void yy_reduce(
} }
yymsp[-4].minor.yy358 = yylhsminor.yy358; yymsp[-4].minor.yy358 = yylhsminor.yy358;
break; break;
case 130: /* columnlist ::= columnlist COMMA column */ case 133: /* columnlist ::= columnlist COMMA column */
{taosArrayPush(yymsp[-2].minor.yy247, &yymsp[0].minor.yy179); yylhsminor.yy247 = yymsp[-2].minor.yy247; } {taosArrayPush(yymsp[-2].minor.yy247, &yymsp[0].minor.yy179); yylhsminor.yy247 = yymsp[-2].minor.yy247; }
yymsp[-2].minor.yy247 = yylhsminor.yy247; yymsp[-2].minor.yy247 = yylhsminor.yy247;
break; break;
case 131: /* columnlist ::= column */ case 134: /* columnlist ::= column */
{yylhsminor.yy247 = taosArrayInit(4, sizeof(TAOS_FIELD)); taosArrayPush(yylhsminor.yy247, &yymsp[0].minor.yy179);} {yylhsminor.yy247 = taosArrayInit(4, sizeof(TAOS_FIELD)); taosArrayPush(yylhsminor.yy247, &yymsp[0].minor.yy179);}
yymsp[0].minor.yy247 = yylhsminor.yy247; yymsp[0].minor.yy247 = yylhsminor.yy247;
break; break;
case 132: /* column ::= ids typename */ case 135: /* column ::= ids typename */
{ {
tSqlSetColumnInfo(&yylhsminor.yy179, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy179); tSqlSetColumnInfo(&yylhsminor.yy179, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy179);
} }
yymsp[-1].minor.yy179 = yylhsminor.yy179; yymsp[-1].minor.yy179 = yylhsminor.yy179;
break; break;
case 133: /* tagitemlist ::= tagitemlist COMMA tagitem */ case 136: /* tagitemlist ::= tagitemlist COMMA tagitem */
{ yylhsminor.yy247 = tVariantListAppend(yymsp[-2].minor.yy247, &yymsp[0].minor.yy378, -1); } { yylhsminor.yy247 = tVariantListAppend(yymsp[-2].minor.yy247, &yymsp[0].minor.yy378, -1); }
yymsp[-2].minor.yy247 = yylhsminor.yy247; yymsp[-2].minor.yy247 = yylhsminor.yy247;
break; break;
case 134: /* tagitemlist ::= tagitem */ case 137: /* tagitemlist ::= tagitem */
{ yylhsminor.yy247 = tVariantListAppend(NULL, &yymsp[0].minor.yy378, -1); } { yylhsminor.yy247 = tVariantListAppend(NULL, &yymsp[0].minor.yy378, -1); }
yymsp[0].minor.yy247 = yylhsminor.yy247; yymsp[0].minor.yy247 = yylhsminor.yy247;
break; break;
case 135: /* tagitem ::= INTEGER */ case 138: /* tagitem ::= INTEGER */
case 136: /* tagitem ::= FLOAT */ yytestcase(yyruleno==136); case 139: /* tagitem ::= FLOAT */ yytestcase(yyruleno==139);
case 137: /* tagitem ::= STRING */ yytestcase(yyruleno==137); case 140: /* tagitem ::= STRING */ yytestcase(yyruleno==140);
case 138: /* tagitem ::= BOOL */ yytestcase(yyruleno==138); case 141: /* tagitem ::= BOOL */ yytestcase(yyruleno==141);
{ toTSDBType(yymsp[0].minor.yy0.type); tVariantCreate(&yylhsminor.yy378, &yymsp[0].minor.yy0); } { toTSDBType(yymsp[0].minor.yy0.type); tVariantCreate(&yylhsminor.yy378, &yymsp[0].minor.yy0); }
yymsp[0].minor.yy378 = yylhsminor.yy378; yymsp[0].minor.yy378 = yylhsminor.yy378;
break; break;
case 139: /* tagitem ::= NULL */ case 142: /* tagitem ::= NULL */
{ yymsp[0].minor.yy0.type = 0; tVariantCreate(&yylhsminor.yy378, &yymsp[0].minor.yy0); } { yymsp[0].minor.yy0.type = 0; tVariantCreate(&yylhsminor.yy378, &yymsp[0].minor.yy0); }
yymsp[0].minor.yy378 = yylhsminor.yy378; yymsp[0].minor.yy378 = yylhsminor.yy378;
break; break;
case 140: /* tagitem ::= MINUS INTEGER */ case 143: /* tagitem ::= MINUS INTEGER */
case 141: /* tagitem ::= MINUS FLOAT */ yytestcase(yyruleno==141); case 144: /* tagitem ::= MINUS FLOAT */ yytestcase(yyruleno==144);
case 142: /* tagitem ::= PLUS INTEGER */ yytestcase(yyruleno==142); case 145: /* tagitem ::= PLUS INTEGER */ yytestcase(yyruleno==145);
case 143: /* tagitem ::= PLUS FLOAT */ yytestcase(yyruleno==143); case 146: /* tagitem ::= PLUS FLOAT */ yytestcase(yyruleno==146);
{ {
yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n; yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n;
yymsp[-1].minor.yy0.type = yymsp[0].minor.yy0.type; yymsp[-1].minor.yy0.type = yymsp[0].minor.yy0.type;
...@@ -2545,74 +2850,74 @@ static void yy_reduce( ...@@ -2545,74 +2850,74 @@ static void yy_reduce(
} }
yymsp[-1].minor.yy378 = yylhsminor.yy378; yymsp[-1].minor.yy378 = yylhsminor.yy378;
break; break;
case 144: /* select ::= SELECT selcollist from where_opt interval_opt fill_opt sliding_opt groupby_opt orderby_opt having_opt slimit_opt limit_opt */ case 147: /* select ::= SELECT selcollist from where_opt interval_opt fill_opt sliding_opt groupby_opt orderby_opt having_opt slimit_opt limit_opt */
{ {
yylhsminor.yy114 = tSetQuerySqlElems(&yymsp[-11].minor.yy0, yymsp[-10].minor.yy522, yymsp[-9].minor.yy247, yymsp[-8].minor.yy326, yymsp[-4].minor.yy247, yymsp[-3].minor.yy247, &yymsp[-7].minor.yy430, &yymsp[-5].minor.yy0, yymsp[-6].minor.yy247, &yymsp[0].minor.yy204, &yymsp[-1].minor.yy204); yylhsminor.yy114 = tSetQuerySqlElems(&yymsp[-11].minor.yy0, yymsp[-10].minor.yy522, yymsp[-9].minor.yy247, yymsp[-8].minor.yy326, yymsp[-4].minor.yy247, yymsp[-3].minor.yy247, &yymsp[-7].minor.yy430, &yymsp[-5].minor.yy0, yymsp[-6].minor.yy247, &yymsp[0].minor.yy204, &yymsp[-1].minor.yy204);
} }
yymsp[-11].minor.yy114 = yylhsminor.yy114; yymsp[-11].minor.yy114 = yylhsminor.yy114;
break; break;
case 145: /* union ::= select */ case 148: /* union ::= select */
{ yylhsminor.yy219 = setSubclause(NULL, yymsp[0].minor.yy114); } { yylhsminor.yy219 = setSubclause(NULL, yymsp[0].minor.yy114); }
yymsp[0].minor.yy219 = yylhsminor.yy219; yymsp[0].minor.yy219 = yylhsminor.yy219;
break; break;
case 146: /* union ::= LP union RP */ case 149: /* union ::= LP union RP */
{ yymsp[-2].minor.yy219 = yymsp[-1].minor.yy219; } { yymsp[-2].minor.yy219 = yymsp[-1].minor.yy219; }
break; break;
case 147: /* union ::= union UNION ALL select */ case 150: /* union ::= union UNION ALL select */
{ yylhsminor.yy219 = appendSelectClause(yymsp[-3].minor.yy219, yymsp[0].minor.yy114); } { yylhsminor.yy219 = appendSelectClause(yymsp[-3].minor.yy219, yymsp[0].minor.yy114); }
yymsp[-3].minor.yy219 = yylhsminor.yy219; yymsp[-3].minor.yy219 = yylhsminor.yy219;
break; break;
case 148: /* union ::= union UNION ALL LP select RP */ case 151: /* union ::= union UNION ALL LP select RP */
{ yylhsminor.yy219 = appendSelectClause(yymsp[-5].minor.yy219, yymsp[-1].minor.yy114); } { yylhsminor.yy219 = appendSelectClause(yymsp[-5].minor.yy219, yymsp[-1].minor.yy114); }
yymsp[-5].minor.yy219 = yylhsminor.yy219; yymsp[-5].minor.yy219 = yylhsminor.yy219;
break; break;
case 149: /* cmd ::= union */ case 152: /* cmd ::= union */
{ setSqlInfo(pInfo, yymsp[0].minor.yy219, NULL, TSDB_SQL_SELECT); } { setSqlInfo(pInfo, yymsp[0].minor.yy219, NULL, TSDB_SQL_SELECT); }
break; break;
case 150: /* select ::= SELECT selcollist */ case 153: /* select ::= SELECT selcollist */
{ {
yylhsminor.yy114 = tSetQuerySqlElems(&yymsp[-1].minor.yy0, yymsp[0].minor.yy522, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); yylhsminor.yy114 = tSetQuerySqlElems(&yymsp[-1].minor.yy0, yymsp[0].minor.yy522, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
} }
yymsp[-1].minor.yy114 = yylhsminor.yy114; yymsp[-1].minor.yy114 = yylhsminor.yy114;
break; break;
case 151: /* sclp ::= selcollist COMMA */ case 154: /* sclp ::= selcollist COMMA */
{yylhsminor.yy522 = yymsp[-1].minor.yy522;} {yylhsminor.yy522 = yymsp[-1].minor.yy522;}
yymsp[-1].minor.yy522 = yylhsminor.yy522; yymsp[-1].minor.yy522 = yylhsminor.yy522;
break; break;
case 152: /* sclp ::= */ case 155: /* sclp ::= */
{yymsp[1].minor.yy522 = 0;} {yymsp[1].minor.yy522 = 0;}
break; break;
case 153: /* selcollist ::= sclp distinct expr as */ case 156: /* selcollist ::= sclp distinct expr as */
{ {
yylhsminor.yy522 = tSqlExprListAppend(yymsp[-3].minor.yy522, yymsp[-1].minor.yy326, yymsp[-2].minor.yy0.n? &yymsp[-2].minor.yy0:0, yymsp[0].minor.yy0.n?&yymsp[0].minor.yy0:0); yylhsminor.yy522 = tSqlExprListAppend(yymsp[-3].minor.yy522, yymsp[-1].minor.yy326, yymsp[-2].minor.yy0.n? &yymsp[-2].minor.yy0:0, yymsp[0].minor.yy0.n?&yymsp[0].minor.yy0:0);
} }
yymsp[-3].minor.yy522 = yylhsminor.yy522; yymsp[-3].minor.yy522 = yylhsminor.yy522;
break; break;
case 154: /* selcollist ::= sclp STAR */ case 157: /* selcollist ::= sclp STAR */
{ {
tSQLExpr *pNode = tSqlExprIdValueCreate(NULL, TK_ALL); tSQLExpr *pNode = tSqlExprIdValueCreate(NULL, TK_ALL);
yylhsminor.yy522 = tSqlExprListAppend(yymsp[-1].minor.yy522, pNode, 0, 0); yylhsminor.yy522 = tSqlExprListAppend(yymsp[-1].minor.yy522, pNode, 0, 0);
} }
yymsp[-1].minor.yy522 = yylhsminor.yy522; yymsp[-1].minor.yy522 = yylhsminor.yy522;
break; break;
case 155: /* as ::= AS ids */ case 158: /* as ::= AS ids */
{ yymsp[-1].minor.yy0 = yymsp[0].minor.yy0; } { yymsp[-1].minor.yy0 = yymsp[0].minor.yy0; }
break; break;
case 156: /* as ::= ids */ case 159: /* as ::= ids */
{ yylhsminor.yy0 = yymsp[0].minor.yy0; } { yylhsminor.yy0 = yymsp[0].minor.yy0; }
yymsp[0].minor.yy0 = yylhsminor.yy0; yymsp[0].minor.yy0 = yylhsminor.yy0;
break; break;
case 157: /* as ::= */ case 160: /* as ::= */
{ yymsp[1].minor.yy0.n = 0; } { yymsp[1].minor.yy0.n = 0; }
break; break;
case 158: /* distinct ::= DISTINCT */ case 161: /* distinct ::= DISTINCT */
{ yylhsminor.yy0 = yymsp[0].minor.yy0; } { yylhsminor.yy0 = yymsp[0].minor.yy0; }
yymsp[0].minor.yy0 = yylhsminor.yy0; yymsp[0].minor.yy0 = yylhsminor.yy0;
break; break;
case 160: /* from ::= FROM tablelist */ case 163: /* from ::= FROM tablelist */
{yymsp[-1].minor.yy247 = yymsp[0].minor.yy247;} {yymsp[-1].minor.yy247 = yymsp[0].minor.yy247;}
break; break;
case 161: /* tablelist ::= ids cpxName */ case 164: /* tablelist ::= ids cpxName */
{ {
toTSDBType(yymsp[-1].minor.yy0.type); toTSDBType(yymsp[-1].minor.yy0.type);
yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n; yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n;
...@@ -2621,7 +2926,7 @@ static void yy_reduce( ...@@ -2621,7 +2926,7 @@ static void yy_reduce(
} }
yymsp[-1].minor.yy247 = yylhsminor.yy247; yymsp[-1].minor.yy247 = yylhsminor.yy247;
break; break;
case 162: /* tablelist ::= ids cpxName ids */ case 165: /* tablelist ::= ids cpxName ids */
{ {
toTSDBType(yymsp[-2].minor.yy0.type); toTSDBType(yymsp[-2].minor.yy0.type);
toTSDBType(yymsp[0].minor.yy0.type); toTSDBType(yymsp[0].minor.yy0.type);
...@@ -2631,7 +2936,7 @@ static void yy_reduce( ...@@ -2631,7 +2936,7 @@ static void yy_reduce(
} }
yymsp[-2].minor.yy247 = yylhsminor.yy247; yymsp[-2].minor.yy247 = yylhsminor.yy247;
break; break;
case 163: /* tablelist ::= tablelist COMMA ids cpxName */ case 166: /* tablelist ::= tablelist COMMA ids cpxName */
{ {
toTSDBType(yymsp[-1].minor.yy0.type); toTSDBType(yymsp[-1].minor.yy0.type);
yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n; yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n;
...@@ -2640,7 +2945,7 @@ static void yy_reduce( ...@@ -2640,7 +2945,7 @@ static void yy_reduce(
} }
yymsp[-3].minor.yy247 = yylhsminor.yy247; yymsp[-3].minor.yy247 = yylhsminor.yy247;
break; break;
case 164: /* tablelist ::= tablelist COMMA ids cpxName ids */ case 167: /* tablelist ::= tablelist COMMA ids cpxName ids */
{ {
toTSDBType(yymsp[-2].minor.yy0.type); toTSDBType(yymsp[-2].minor.yy0.type);
toTSDBType(yymsp[0].minor.yy0.type); toTSDBType(yymsp[0].minor.yy0.type);
...@@ -2650,23 +2955,23 @@ static void yy_reduce( ...@@ -2650,23 +2955,23 @@ static void yy_reduce(
} }
yymsp[-4].minor.yy247 = yylhsminor.yy247; yymsp[-4].minor.yy247 = yylhsminor.yy247;
break; break;
case 165: /* tmvar ::= VARIABLE */ case 168: /* tmvar ::= VARIABLE */
{yylhsminor.yy0 = yymsp[0].minor.yy0;} {yylhsminor.yy0 = yymsp[0].minor.yy0;}
yymsp[0].minor.yy0 = yylhsminor.yy0; yymsp[0].minor.yy0 = yylhsminor.yy0;
break; break;
case 166: /* interval_opt ::= INTERVAL LP tmvar RP */ case 169: /* interval_opt ::= INTERVAL LP tmvar RP */
{yymsp[-3].minor.yy430.interval = yymsp[-1].minor.yy0; yymsp[-3].minor.yy430.offset.n = 0; yymsp[-3].minor.yy430.offset.z = NULL; yymsp[-3].minor.yy430.offset.type = 0;} {yymsp[-3].minor.yy430.interval = yymsp[-1].minor.yy0; yymsp[-3].minor.yy430.offset.n = 0; yymsp[-3].minor.yy430.offset.z = NULL; yymsp[-3].minor.yy430.offset.type = 0;}
break; break;
case 167: /* interval_opt ::= INTERVAL LP tmvar COMMA tmvar RP */ case 170: /* interval_opt ::= INTERVAL LP tmvar COMMA tmvar RP */
{yymsp[-5].minor.yy430.interval = yymsp[-3].minor.yy0; yymsp[-5].minor.yy430.offset = yymsp[-1].minor.yy0;} {yymsp[-5].minor.yy430.interval = yymsp[-3].minor.yy0; yymsp[-5].minor.yy430.offset = yymsp[-1].minor.yy0;}
break; break;
case 168: /* interval_opt ::= */ case 171: /* interval_opt ::= */
{memset(&yymsp[1].minor.yy430, 0, sizeof(yymsp[1].minor.yy430));} {memset(&yymsp[1].minor.yy430, 0, sizeof(yymsp[1].minor.yy430));}
break; break;
case 169: /* fill_opt ::= */ case 172: /* fill_opt ::= */
{yymsp[1].minor.yy247 = 0; } {yymsp[1].minor.yy247 = 0; }
break; break;
case 170: /* fill_opt ::= FILL LP ID COMMA tagitemlist RP */ case 173: /* fill_opt ::= FILL LP ID COMMA tagitemlist RP */
{ {
tVariant A = {0}; tVariant A = {0};
toTSDBType(yymsp[-3].minor.yy0.type); toTSDBType(yymsp[-3].minor.yy0.type);
...@@ -2676,37 +2981,37 @@ static void yy_reduce( ...@@ -2676,37 +2981,37 @@ static void yy_reduce(
yymsp[-5].minor.yy247 = yymsp[-1].minor.yy247; yymsp[-5].minor.yy247 = yymsp[-1].minor.yy247;
} }
break; break;
case 171: /* fill_opt ::= FILL LP ID RP */ case 174: /* fill_opt ::= FILL LP ID RP */
{ {
toTSDBType(yymsp[-1].minor.yy0.type); toTSDBType(yymsp[-1].minor.yy0.type);
yymsp[-3].minor.yy247 = tVariantListAppendToken(NULL, &yymsp[-1].minor.yy0, -1); yymsp[-3].minor.yy247 = tVariantListAppendToken(NULL, &yymsp[-1].minor.yy0, -1);
} }
break; break;
case 172: /* sliding_opt ::= SLIDING LP tmvar RP */ case 175: /* sliding_opt ::= SLIDING LP tmvar RP */
{yymsp[-3].minor.yy0 = yymsp[-1].minor.yy0; } {yymsp[-3].minor.yy0 = yymsp[-1].minor.yy0; }
break; break;
case 173: /* sliding_opt ::= */ case 176: /* sliding_opt ::= */
{yymsp[1].minor.yy0.n = 0; yymsp[1].minor.yy0.z = NULL; yymsp[1].minor.yy0.type = 0; } {yymsp[1].minor.yy0.n = 0; yymsp[1].minor.yy0.z = NULL; yymsp[1].minor.yy0.type = 0; }
break; break;
case 174: /* orderby_opt ::= */ case 177: /* orderby_opt ::= */
{yymsp[1].minor.yy247 = 0;} {yymsp[1].minor.yy247 = 0;}
break; break;
case 175: /* orderby_opt ::= ORDER BY sortlist */ case 178: /* orderby_opt ::= ORDER BY sortlist */
{yymsp[-2].minor.yy247 = yymsp[0].minor.yy247;} {yymsp[-2].minor.yy247 = yymsp[0].minor.yy247;}
break; break;
case 176: /* sortlist ::= sortlist COMMA item sortorder */ case 179: /* sortlist ::= sortlist COMMA item sortorder */
{ {
yylhsminor.yy247 = tVariantListAppend(yymsp[-3].minor.yy247, &yymsp[-1].minor.yy378, yymsp[0].minor.yy222); yylhsminor.yy247 = tVariantListAppend(yymsp[-3].minor.yy247, &yymsp[-1].minor.yy378, yymsp[0].minor.yy222);
} }
yymsp[-3].minor.yy247 = yylhsminor.yy247; yymsp[-3].minor.yy247 = yylhsminor.yy247;
break; break;
case 177: /* sortlist ::= item sortorder */ case 180: /* sortlist ::= item sortorder */
{ {
yylhsminor.yy247 = tVariantListAppend(NULL, &yymsp[-1].minor.yy378, yymsp[0].minor.yy222); yylhsminor.yy247 = tVariantListAppend(NULL, &yymsp[-1].minor.yy378, yymsp[0].minor.yy222);
} }
yymsp[-1].minor.yy247 = yylhsminor.yy247; yymsp[-1].minor.yy247 = yylhsminor.yy247;
break; break;
case 178: /* item ::= ids cpxName */ case 181: /* item ::= ids cpxName */
{ {
toTSDBType(yymsp[-1].minor.yy0.type); toTSDBType(yymsp[-1].minor.yy0.type);
yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n; yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n;
...@@ -2715,211 +3020,211 @@ static void yy_reduce( ...@@ -2715,211 +3020,211 @@ static void yy_reduce(
} }
yymsp[-1].minor.yy378 = yylhsminor.yy378; yymsp[-1].minor.yy378 = yylhsminor.yy378;
break; break;
case 179: /* sortorder ::= ASC */ case 182: /* sortorder ::= ASC */
{ yymsp[0].minor.yy222 = TSDB_ORDER_ASC; } { yymsp[0].minor.yy222 = TSDB_ORDER_ASC; }
break; break;
case 180: /* sortorder ::= DESC */ case 183: /* sortorder ::= DESC */
{ yymsp[0].minor.yy222 = TSDB_ORDER_DESC;} { yymsp[0].minor.yy222 = TSDB_ORDER_DESC;}
break; break;
case 181: /* sortorder ::= */ case 184: /* sortorder ::= */
{ yymsp[1].minor.yy222 = TSDB_ORDER_ASC; } { yymsp[1].minor.yy222 = TSDB_ORDER_ASC; }
break; break;
case 182: /* groupby_opt ::= */ case 185: /* groupby_opt ::= */
{ yymsp[1].minor.yy247 = 0;} { yymsp[1].minor.yy247 = 0;}
break; break;
case 183: /* groupby_opt ::= GROUP BY grouplist */ case 186: /* groupby_opt ::= GROUP BY grouplist */
{ yymsp[-2].minor.yy247 = yymsp[0].minor.yy247;} { yymsp[-2].minor.yy247 = yymsp[0].minor.yy247;}
break; break;
case 184: /* grouplist ::= grouplist COMMA item */ case 187: /* grouplist ::= grouplist COMMA item */
{ {
yylhsminor.yy247 = tVariantListAppend(yymsp[-2].minor.yy247, &yymsp[0].minor.yy378, -1); yylhsminor.yy247 = tVariantListAppend(yymsp[-2].minor.yy247, &yymsp[0].minor.yy378, -1);
} }
yymsp[-2].minor.yy247 = yylhsminor.yy247; yymsp[-2].minor.yy247 = yylhsminor.yy247;
break; break;
case 185: /* grouplist ::= item */ case 188: /* grouplist ::= item */
{ {
yylhsminor.yy247 = tVariantListAppend(NULL, &yymsp[0].minor.yy378, -1); yylhsminor.yy247 = tVariantListAppend(NULL, &yymsp[0].minor.yy378, -1);
} }
yymsp[0].minor.yy247 = yylhsminor.yy247; yymsp[0].minor.yy247 = yylhsminor.yy247;
break; break;
case 186: /* having_opt ::= */ case 189: /* having_opt ::= */
case 196: /* where_opt ::= */ yytestcase(yyruleno==196); case 199: /* where_opt ::= */ yytestcase(yyruleno==199);
case 234: /* expritem ::= */ yytestcase(yyruleno==234); case 237: /* expritem ::= */ yytestcase(yyruleno==237);
{yymsp[1].minor.yy326 = 0;} {yymsp[1].minor.yy326 = 0;}
break; break;
case 187: /* having_opt ::= HAVING expr */ case 190: /* having_opt ::= HAVING expr */
case 197: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==197); case 200: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==200);
{yymsp[-1].minor.yy326 = yymsp[0].minor.yy326;} {yymsp[-1].minor.yy326 = yymsp[0].minor.yy326;}
break; break;
case 188: /* limit_opt ::= */ case 191: /* limit_opt ::= */
case 192: /* slimit_opt ::= */ yytestcase(yyruleno==192); case 195: /* slimit_opt ::= */ yytestcase(yyruleno==195);
{yymsp[1].minor.yy204.limit = -1; yymsp[1].minor.yy204.offset = 0;} {yymsp[1].minor.yy204.limit = -1; yymsp[1].minor.yy204.offset = 0;}
break; break;
case 189: /* limit_opt ::= LIMIT signed */ case 192: /* limit_opt ::= LIMIT signed */
case 193: /* slimit_opt ::= SLIMIT signed */ yytestcase(yyruleno==193); case 196: /* slimit_opt ::= SLIMIT signed */ yytestcase(yyruleno==196);
{yymsp[-1].minor.yy204.limit = yymsp[0].minor.yy403; yymsp[-1].minor.yy204.offset = 0;} {yymsp[-1].minor.yy204.limit = yymsp[0].minor.yy403; yymsp[-1].minor.yy204.offset = 0;}
break; break;
case 190: /* limit_opt ::= LIMIT signed OFFSET signed */ case 193: /* limit_opt ::= LIMIT signed OFFSET signed */
{ yymsp[-3].minor.yy204.limit = yymsp[-2].minor.yy403; yymsp[-3].minor.yy204.offset = yymsp[0].minor.yy403;} { yymsp[-3].minor.yy204.limit = yymsp[-2].minor.yy403; yymsp[-3].minor.yy204.offset = yymsp[0].minor.yy403;}
break; break;
case 191: /* limit_opt ::= LIMIT signed COMMA signed */ case 194: /* limit_opt ::= LIMIT signed COMMA signed */
{ yymsp[-3].minor.yy204.limit = yymsp[0].minor.yy403; yymsp[-3].minor.yy204.offset = yymsp[-2].minor.yy403;} { yymsp[-3].minor.yy204.limit = yymsp[0].minor.yy403; yymsp[-3].minor.yy204.offset = yymsp[-2].minor.yy403;}
break; break;
case 194: /* slimit_opt ::= SLIMIT signed SOFFSET signed */ case 197: /* slimit_opt ::= SLIMIT signed SOFFSET signed */
{yymsp[-3].minor.yy204.limit = yymsp[-2].minor.yy403; yymsp[-3].minor.yy204.offset = yymsp[0].minor.yy403;} {yymsp[-3].minor.yy204.limit = yymsp[-2].minor.yy403; yymsp[-3].minor.yy204.offset = yymsp[0].minor.yy403;}
break; break;
case 195: /* slimit_opt ::= SLIMIT signed COMMA signed */ case 198: /* slimit_opt ::= SLIMIT signed COMMA signed */
{yymsp[-3].minor.yy204.limit = yymsp[0].minor.yy403; yymsp[-3].minor.yy204.offset = yymsp[-2].minor.yy403;} {yymsp[-3].minor.yy204.limit = yymsp[0].minor.yy403; yymsp[-3].minor.yy204.offset = yymsp[-2].minor.yy403;}
break; break;
case 198: /* expr ::= LP expr RP */ case 201: /* expr ::= LP expr RP */
{yylhsminor.yy326 = yymsp[-1].minor.yy326; yylhsminor.yy326->token.z = yymsp[-2].minor.yy0.z; yylhsminor.yy326->token.n = (yymsp[0].minor.yy0.z - yymsp[-2].minor.yy0.z + 1);} {yylhsminor.yy326 = yymsp[-1].minor.yy326; yylhsminor.yy326->token.z = yymsp[-2].minor.yy0.z; yylhsminor.yy326->token.n = (yymsp[0].minor.yy0.z - yymsp[-2].minor.yy0.z + 1);}
yymsp[-2].minor.yy326 = yylhsminor.yy326; yymsp[-2].minor.yy326 = yylhsminor.yy326;
break; break;
case 199: /* expr ::= ID */ case 202: /* expr ::= ID */
{ yylhsminor.yy326 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_ID);} { yylhsminor.yy326 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_ID);}
yymsp[0].minor.yy326 = yylhsminor.yy326; yymsp[0].minor.yy326 = yylhsminor.yy326;
break; break;
case 200: /* expr ::= ID DOT ID */ case 203: /* expr ::= ID DOT ID */
{ yymsp[-2].minor.yy0.n += (1+yymsp[0].minor.yy0.n); yylhsminor.yy326 = tSqlExprIdValueCreate(&yymsp[-2].minor.yy0, TK_ID);} { yymsp[-2].minor.yy0.n += (1+yymsp[0].minor.yy0.n); yylhsminor.yy326 = tSqlExprIdValueCreate(&yymsp[-2].minor.yy0, TK_ID);}
yymsp[-2].minor.yy326 = yylhsminor.yy326; yymsp[-2].minor.yy326 = yylhsminor.yy326;
break; break;
case 201: /* expr ::= ID DOT STAR */ case 204: /* expr ::= ID DOT STAR */
{ yymsp[-2].minor.yy0.n += (1+yymsp[0].minor.yy0.n); yylhsminor.yy326 = tSqlExprIdValueCreate(&yymsp[-2].minor.yy0, TK_ALL);} { yymsp[-2].minor.yy0.n += (1+yymsp[0].minor.yy0.n); yylhsminor.yy326 = tSqlExprIdValueCreate(&yymsp[-2].minor.yy0, TK_ALL);}
yymsp[-2].minor.yy326 = yylhsminor.yy326; yymsp[-2].minor.yy326 = yylhsminor.yy326;
break; break;
case 202: /* expr ::= INTEGER */ case 205: /* expr ::= INTEGER */
{ yylhsminor.yy326 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_INTEGER);} { yylhsminor.yy326 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_INTEGER);}
yymsp[0].minor.yy326 = yylhsminor.yy326; yymsp[0].minor.yy326 = yylhsminor.yy326;
break; break;
case 203: /* expr ::= MINUS INTEGER */ case 206: /* expr ::= MINUS INTEGER */
case 204: /* expr ::= PLUS INTEGER */ yytestcase(yyruleno==204); case 207: /* expr ::= PLUS INTEGER */ yytestcase(yyruleno==207);
{ yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n; yymsp[-1].minor.yy0.type = TK_INTEGER; yylhsminor.yy326 = tSqlExprIdValueCreate(&yymsp[-1].minor.yy0, TK_INTEGER);} { yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n; yymsp[-1].minor.yy0.type = TK_INTEGER; yylhsminor.yy326 = tSqlExprIdValueCreate(&yymsp[-1].minor.yy0, TK_INTEGER);}
yymsp[-1].minor.yy326 = yylhsminor.yy326; yymsp[-1].minor.yy326 = yylhsminor.yy326;
break; break;
case 205: /* expr ::= FLOAT */ case 208: /* expr ::= FLOAT */
{ yylhsminor.yy326 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_FLOAT);} { yylhsminor.yy326 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_FLOAT);}
yymsp[0].minor.yy326 = yylhsminor.yy326; yymsp[0].minor.yy326 = yylhsminor.yy326;
break; break;
case 206: /* expr ::= MINUS FLOAT */ case 209: /* expr ::= MINUS FLOAT */
case 207: /* expr ::= PLUS FLOAT */ yytestcase(yyruleno==207); case 210: /* expr ::= PLUS FLOAT */ yytestcase(yyruleno==210);
{ yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n; yymsp[-1].minor.yy0.type = TK_FLOAT; yylhsminor.yy326 = tSqlExprIdValueCreate(&yymsp[-1].minor.yy0, TK_FLOAT);} { yymsp[-1].minor.yy0.n += yymsp[0].minor.yy0.n; yymsp[-1].minor.yy0.type = TK_FLOAT; yylhsminor.yy326 = tSqlExprIdValueCreate(&yymsp[-1].minor.yy0, TK_FLOAT);}
yymsp[-1].minor.yy326 = yylhsminor.yy326; yymsp[-1].minor.yy326 = yylhsminor.yy326;
break; break;
case 208: /* expr ::= STRING */ case 211: /* expr ::= STRING */
{ yylhsminor.yy326 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_STRING);} { yylhsminor.yy326 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_STRING);}
yymsp[0].minor.yy326 = yylhsminor.yy326; yymsp[0].minor.yy326 = yylhsminor.yy326;
break; break;
case 209: /* expr ::= NOW */ case 212: /* expr ::= NOW */
{ yylhsminor.yy326 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_NOW); } { yylhsminor.yy326 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_NOW); }
yymsp[0].minor.yy326 = yylhsminor.yy326; yymsp[0].minor.yy326 = yylhsminor.yy326;
break; break;
case 210: /* expr ::= VARIABLE */ case 213: /* expr ::= VARIABLE */
{ yylhsminor.yy326 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_VARIABLE);} { yylhsminor.yy326 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_VARIABLE);}
yymsp[0].minor.yy326 = yylhsminor.yy326; yymsp[0].minor.yy326 = yylhsminor.yy326;
break; break;
case 211: /* expr ::= BOOL */ case 214: /* expr ::= BOOL */
{ yylhsminor.yy326 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_BOOL);} { yylhsminor.yy326 = tSqlExprIdValueCreate(&yymsp[0].minor.yy0, TK_BOOL);}
yymsp[0].minor.yy326 = yylhsminor.yy326; yymsp[0].minor.yy326 = yylhsminor.yy326;
break; break;
case 212: /* expr ::= ID LP exprlist RP */ case 215: /* expr ::= ID LP exprlist RP */
{ yylhsminor.yy326 = tSqlExprCreateFunction(yymsp[-1].minor.yy522, &yymsp[-3].minor.yy0, &yymsp[0].minor.yy0, yymsp[-3].minor.yy0.type); } { yylhsminor.yy326 = tSqlExprCreateFunction(yymsp[-1].minor.yy522, &yymsp[-3].minor.yy0, &yymsp[0].minor.yy0, yymsp[-3].minor.yy0.type); }
yymsp[-3].minor.yy326 = yylhsminor.yy326; yymsp[-3].minor.yy326 = yylhsminor.yy326;
break; break;
case 213: /* expr ::= ID LP STAR RP */ case 216: /* expr ::= ID LP STAR RP */
{ yylhsminor.yy326 = tSqlExprCreateFunction(NULL, &yymsp[-3].minor.yy0, &yymsp[0].minor.yy0, yymsp[-3].minor.yy0.type); } { yylhsminor.yy326 = tSqlExprCreateFunction(NULL, &yymsp[-3].minor.yy0, &yymsp[0].minor.yy0, yymsp[-3].minor.yy0.type); }
yymsp[-3].minor.yy326 = yylhsminor.yy326; yymsp[-3].minor.yy326 = yylhsminor.yy326;
break; break;
case 214: /* expr ::= expr IS NULL */ case 217: /* expr ::= expr IS NULL */
{yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, NULL, TK_ISNULL);} {yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, NULL, TK_ISNULL);}
yymsp[-2].minor.yy326 = yylhsminor.yy326; yymsp[-2].minor.yy326 = yylhsminor.yy326;
break; break;
case 215: /* expr ::= expr IS NOT NULL */ case 218: /* expr ::= expr IS NOT NULL */
{yylhsminor.yy326 = tSqlExprCreate(yymsp[-3].minor.yy326, NULL, TK_NOTNULL);} {yylhsminor.yy326 = tSqlExprCreate(yymsp[-3].minor.yy326, NULL, TK_NOTNULL);}
yymsp[-3].minor.yy326 = yylhsminor.yy326; yymsp[-3].minor.yy326 = yylhsminor.yy326;
break; break;
case 216: /* expr ::= expr LT expr */ case 219: /* expr ::= expr LT expr */
{yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_LT);} {yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_LT);}
yymsp[-2].minor.yy326 = yylhsminor.yy326; yymsp[-2].minor.yy326 = yylhsminor.yy326;
break; break;
case 217: /* expr ::= expr GT expr */ case 220: /* expr ::= expr GT expr */
{yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_GT);} {yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_GT);}
yymsp[-2].minor.yy326 = yylhsminor.yy326; yymsp[-2].minor.yy326 = yylhsminor.yy326;
break; break;
case 218: /* expr ::= expr LE expr */ case 221: /* expr ::= expr LE expr */
{yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_LE);} {yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_LE);}
yymsp[-2].minor.yy326 = yylhsminor.yy326; yymsp[-2].minor.yy326 = yylhsminor.yy326;
break; break;
case 219: /* expr ::= expr GE expr */ case 222: /* expr ::= expr GE expr */
{yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_GE);} {yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_GE);}
yymsp[-2].minor.yy326 = yylhsminor.yy326; yymsp[-2].minor.yy326 = yylhsminor.yy326;
break; break;
case 220: /* expr ::= expr NE expr */ case 223: /* expr ::= expr NE expr */
{yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_NE);} {yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_NE);}
yymsp[-2].minor.yy326 = yylhsminor.yy326; yymsp[-2].minor.yy326 = yylhsminor.yy326;
break; break;
case 221: /* expr ::= expr EQ expr */ case 224: /* expr ::= expr EQ expr */
{yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_EQ);} {yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_EQ);}
yymsp[-2].minor.yy326 = yylhsminor.yy326; yymsp[-2].minor.yy326 = yylhsminor.yy326;
break; break;
case 222: /* expr ::= expr AND expr */ case 225: /* expr ::= expr AND expr */
{yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_AND);} {yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_AND);}
yymsp[-2].minor.yy326 = yylhsminor.yy326; yymsp[-2].minor.yy326 = yylhsminor.yy326;
break; break;
case 223: /* expr ::= expr OR expr */ case 226: /* expr ::= expr OR expr */
{yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_OR); } {yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_OR); }
yymsp[-2].minor.yy326 = yylhsminor.yy326; yymsp[-2].minor.yy326 = yylhsminor.yy326;
break; break;
case 224: /* expr ::= expr PLUS expr */ case 227: /* expr ::= expr PLUS expr */
{yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_PLUS); } {yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_PLUS); }
yymsp[-2].minor.yy326 = yylhsminor.yy326; yymsp[-2].minor.yy326 = yylhsminor.yy326;
break; break;
case 225: /* expr ::= expr MINUS expr */ case 228: /* expr ::= expr MINUS expr */
{yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_MINUS); } {yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_MINUS); }
yymsp[-2].minor.yy326 = yylhsminor.yy326; yymsp[-2].minor.yy326 = yylhsminor.yy326;
break; break;
case 226: /* expr ::= expr STAR expr */ case 229: /* expr ::= expr STAR expr */
{yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_STAR); } {yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_STAR); }
yymsp[-2].minor.yy326 = yylhsminor.yy326; yymsp[-2].minor.yy326 = yylhsminor.yy326;
break; break;
case 227: /* expr ::= expr SLASH expr */ case 230: /* expr ::= expr SLASH expr */
{yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_DIVIDE);} {yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_DIVIDE);}
yymsp[-2].minor.yy326 = yylhsminor.yy326; yymsp[-2].minor.yy326 = yylhsminor.yy326;
break; break;
case 228: /* expr ::= expr REM expr */ case 231: /* expr ::= expr REM expr */
{yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_REM); } {yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_REM); }
yymsp[-2].minor.yy326 = yylhsminor.yy326; yymsp[-2].minor.yy326 = yylhsminor.yy326;
break; break;
case 229: /* expr ::= expr LIKE expr */ case 232: /* expr ::= expr LIKE expr */
{yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_LIKE); } {yylhsminor.yy326 = tSqlExprCreate(yymsp[-2].minor.yy326, yymsp[0].minor.yy326, TK_LIKE); }
yymsp[-2].minor.yy326 = yylhsminor.yy326; yymsp[-2].minor.yy326 = yylhsminor.yy326;
break; break;
case 230: /* expr ::= expr IN LP exprlist RP */ case 233: /* expr ::= expr IN LP exprlist RP */
{yylhsminor.yy326 = tSqlExprCreate(yymsp[-4].minor.yy326, (tSQLExpr*)yymsp[-1].minor.yy522, TK_IN); } {yylhsminor.yy326 = tSqlExprCreate(yymsp[-4].minor.yy326, (tSQLExpr*)yymsp[-1].minor.yy522, TK_IN); }
yymsp[-4].minor.yy326 = yylhsminor.yy326; yymsp[-4].minor.yy326 = yylhsminor.yy326;
break; break;
case 231: /* exprlist ::= exprlist COMMA expritem */ case 234: /* exprlist ::= exprlist COMMA expritem */
{yylhsminor.yy522 = tSqlExprListAppend(yymsp[-2].minor.yy522,yymsp[0].minor.yy326,0, 0);} {yylhsminor.yy522 = tSqlExprListAppend(yymsp[-2].minor.yy522,yymsp[0].minor.yy326,0, 0);}
yymsp[-2].minor.yy522 = yylhsminor.yy522; yymsp[-2].minor.yy522 = yylhsminor.yy522;
break; break;
case 232: /* exprlist ::= expritem */ case 235: /* exprlist ::= expritem */
{yylhsminor.yy522 = tSqlExprListAppend(0,yymsp[0].minor.yy326,0, 0);} {yylhsminor.yy522 = tSqlExprListAppend(0,yymsp[0].minor.yy326,0, 0);}
yymsp[0].minor.yy522 = yylhsminor.yy522; yymsp[0].minor.yy522 = yylhsminor.yy522;
break; break;
case 233: /* expritem ::= expr */ case 236: /* expritem ::= expr */
{yylhsminor.yy326 = yymsp[0].minor.yy326;} {yylhsminor.yy326 = yymsp[0].minor.yy326;}
yymsp[0].minor.yy326 = yylhsminor.yy326; yymsp[0].minor.yy326 = yylhsminor.yy326;
break; break;
case 235: /* cmd ::= RESET QUERY CACHE */ case 238: /* cmd ::= RESET QUERY CACHE */
{ setDCLSQLElems(pInfo, TSDB_SQL_RESET_CACHE, 0);} { setDCLSQLElems(pInfo, TSDB_SQL_RESET_CACHE, 0);}
break; break;
case 236: /* cmd ::= ALTER TABLE ids cpxName ADD COLUMN columnlist */ case 239: /* cmd ::= ALTER TABLE ids cpxName ADD COLUMN columnlist */
{ {
yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n; yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n;
SAlterTableInfo* pAlterTable = tAlterTableSqlElems(&yymsp[-4].minor.yy0, yymsp[0].minor.yy247, NULL, TSDB_ALTER_TABLE_ADD_COLUMN, -1); SAlterTableInfo* pAlterTable = tAlterTableSqlElems(&yymsp[-4].minor.yy0, yymsp[0].minor.yy247, NULL, TSDB_ALTER_TABLE_ADD_COLUMN, -1);
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE); setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
} }
break; break;
case 237: /* cmd ::= ALTER TABLE ids cpxName DROP COLUMN ids */ case 240: /* cmd ::= ALTER TABLE ids cpxName DROP COLUMN ids */
{ {
yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n; yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n;
...@@ -2930,14 +3235,14 @@ static void yy_reduce( ...@@ -2930,14 +3235,14 @@ static void yy_reduce(
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE); setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
} }
break; break;
case 238: /* cmd ::= ALTER TABLE ids cpxName ADD TAG columnlist */ case 241: /* cmd ::= ALTER TABLE ids cpxName ADD TAG columnlist */
{ {
yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n; yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n;
SAlterTableInfo* pAlterTable = tAlterTableSqlElems(&yymsp[-4].minor.yy0, yymsp[0].minor.yy247, NULL, TSDB_ALTER_TABLE_ADD_TAG_COLUMN, -1); SAlterTableInfo* pAlterTable = tAlterTableSqlElems(&yymsp[-4].minor.yy0, yymsp[0].minor.yy247, NULL, TSDB_ALTER_TABLE_ADD_TAG_COLUMN, -1);
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE); setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
} }
break; break;
case 239: /* cmd ::= ALTER TABLE ids cpxName DROP TAG ids */ case 242: /* cmd ::= ALTER TABLE ids cpxName DROP TAG ids */
{ {
yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n; yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n;
...@@ -2948,7 +3253,7 @@ static void yy_reduce( ...@@ -2948,7 +3253,7 @@ static void yy_reduce(
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE); setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
} }
break; break;
case 240: /* cmd ::= ALTER TABLE ids cpxName CHANGE TAG ids ids */ case 243: /* cmd ::= ALTER TABLE ids cpxName CHANGE TAG ids ids */
{ {
yymsp[-5].minor.yy0.n += yymsp[-4].minor.yy0.n; yymsp[-5].minor.yy0.n += yymsp[-4].minor.yy0.n;
...@@ -2962,7 +3267,7 @@ static void yy_reduce( ...@@ -2962,7 +3267,7 @@ static void yy_reduce(
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE); setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
} }
break; break;
case 241: /* cmd ::= ALTER TABLE ids cpxName SET TAG ids EQ tagitem */ case 244: /* cmd ::= ALTER TABLE ids cpxName SET TAG ids EQ tagitem */
{ {
yymsp[-6].minor.yy0.n += yymsp[-5].minor.yy0.n; yymsp[-6].minor.yy0.n += yymsp[-5].minor.yy0.n;
...@@ -2974,14 +3279,14 @@ static void yy_reduce( ...@@ -2974,14 +3279,14 @@ static void yy_reduce(
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE); setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
} }
break; break;
case 242: /* cmd ::= ALTER STABLE ids cpxName ADD COLUMN columnlist */ case 245: /* cmd ::= ALTER STABLE ids cpxName ADD COLUMN columnlist */
{ {
yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n; yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n;
SAlterTableInfo* pAlterTable = tAlterTableSqlElems(&yymsp[-4].minor.yy0, yymsp[0].minor.yy247, NULL, TSDB_ALTER_TABLE_ADD_COLUMN, TSDB_SUPER_TABLE); SAlterTableInfo* pAlterTable = tAlterTableSqlElems(&yymsp[-4].minor.yy0, yymsp[0].minor.yy247, NULL, TSDB_ALTER_TABLE_ADD_COLUMN, TSDB_SUPER_TABLE);
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE); setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
} }
break; break;
case 243: /* cmd ::= ALTER STABLE ids cpxName DROP COLUMN ids */ case 246: /* cmd ::= ALTER STABLE ids cpxName DROP COLUMN ids */
{ {
yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n; yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n;
...@@ -2992,14 +3297,14 @@ static void yy_reduce( ...@@ -2992,14 +3297,14 @@ static void yy_reduce(
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE); setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
} }
break; break;
case 244: /* cmd ::= ALTER STABLE ids cpxName ADD TAG columnlist */ case 247: /* cmd ::= ALTER STABLE ids cpxName ADD TAG columnlist */
{ {
yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n; yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n;
SAlterTableInfo* pAlterTable = tAlterTableSqlElems(&yymsp[-4].minor.yy0, yymsp[0].minor.yy247, NULL, TSDB_ALTER_TABLE_ADD_TAG_COLUMN, TSDB_SUPER_TABLE); SAlterTableInfo* pAlterTable = tAlterTableSqlElems(&yymsp[-4].minor.yy0, yymsp[0].minor.yy247, NULL, TSDB_ALTER_TABLE_ADD_TAG_COLUMN, TSDB_SUPER_TABLE);
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE); setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
} }
break; break;
case 245: /* cmd ::= ALTER STABLE ids cpxName DROP TAG ids */ case 248: /* cmd ::= ALTER STABLE ids cpxName DROP TAG ids */
{ {
yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n; yymsp[-4].minor.yy0.n += yymsp[-3].minor.yy0.n;
...@@ -3010,7 +3315,7 @@ static void yy_reduce( ...@@ -3010,7 +3315,7 @@ static void yy_reduce(
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE); setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
} }
break; break;
case 246: /* cmd ::= ALTER STABLE ids cpxName CHANGE TAG ids ids */ case 249: /* cmd ::= ALTER STABLE ids cpxName CHANGE TAG ids ids */
{ {
yymsp[-5].minor.yy0.n += yymsp[-4].minor.yy0.n; yymsp[-5].minor.yy0.n += yymsp[-4].minor.yy0.n;
...@@ -3024,22 +3329,22 @@ static void yy_reduce( ...@@ -3024,22 +3329,22 @@ static void yy_reduce(
setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE); setSqlInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
} }
break; break;
case 247: /* cmd ::= KILL CONNECTION INTEGER */ case 250: /* cmd ::= KILL CONNECTION INTEGER */
{setKillSql(pInfo, TSDB_SQL_KILL_CONNECTION, &yymsp[0].minor.yy0);} {setKillSql(pInfo, TSDB_SQL_KILL_CONNECTION, &yymsp[0].minor.yy0);}
break; break;
case 248: /* cmd ::= KILL STREAM INTEGER COLON INTEGER */ case 251: /* 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);} {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; break;
case 249: /* cmd ::= KILL QUERY INTEGER COLON INTEGER */ case 252: /* 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);} {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; break;
default: default:
break; break;
/********** End reduce actions ************************************************/ /********** End reduce actions ************************************************/
}; };
assert( yyruleno<sizeof(yyRuleInfo)/sizeof(yyRuleInfo[0]) ); assert( yyruleno<sizeof(yyRuleInfoLhs)/sizeof(yyRuleInfoLhs[0]) );
yygoto = yyRuleInfo[yyruleno].lhs; yygoto = yyRuleInfoLhs[yyruleno];
yysize = yyRuleInfo[yyruleno].nrhs; yysize = yyRuleInfoNRhs[yyruleno];
yyact = yy_find_reduce_action(yymsp[yysize].stateno,(YYCODETYPE)yygoto); yyact = yy_find_reduce_action(yymsp[yysize].stateno,(YYCODETYPE)yygoto);
/* There are no SHIFTREDUCE actions on nonterminals because the table /* There are no SHIFTREDUCE actions on nonterminals because the table
...@@ -3054,6 +3359,7 @@ static void yy_reduce( ...@@ -3054,6 +3359,7 @@ static void yy_reduce(
yymsp->stateno = (YYACTIONTYPE)yyact; yymsp->stateno = (YYACTIONTYPE)yyact;
yymsp->major = (YYCODETYPE)yygoto; yymsp->major = (YYCODETYPE)yygoto;
yyTraceShift(yypParser, yyact, "... then shift"); yyTraceShift(yypParser, yyact, "... then shift");
return yyact;
} }
/* /*
...@@ -3063,7 +3369,8 @@ static void yy_reduce( ...@@ -3063,7 +3369,8 @@ static void yy_reduce(
static void yy_parse_failed( static void yy_parse_failed(
yyParser *yypParser /* The parser */ yyParser *yypParser /* The parser */
){ ){
ParseARG_FETCH; ParseARG_FETCH
ParseCTX_FETCH
#ifndef NDEBUG #ifndef NDEBUG
if( yyTraceFILE ){ if( yyTraceFILE ){
fprintf(yyTraceFILE,"%sFail!\n",yyTracePrompt); fprintf(yyTraceFILE,"%sFail!\n",yyTracePrompt);
...@@ -3074,7 +3381,8 @@ static void yy_parse_failed( ...@@ -3074,7 +3381,8 @@ static void yy_parse_failed(
** parser fails */ ** parser fails */
/************ Begin %parse_failure code ***************************************/ /************ Begin %parse_failure code ***************************************/
/************ End %parse_failure code *****************************************/ /************ End %parse_failure code *****************************************/
ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */ ParseARG_STORE /* Suppress warning about unused %extra_argument variable */
ParseCTX_STORE
} }
#endif /* YYNOERRORRECOVERY */ #endif /* YYNOERRORRECOVERY */
...@@ -3086,7 +3394,8 @@ static void yy_syntax_error( ...@@ -3086,7 +3394,8 @@ static void yy_syntax_error(
int yymajor, /* The major type of the error token */ int yymajor, /* The major type of the error token */
ParseTOKENTYPE yyminor /* The minor type of the error token */ ParseTOKENTYPE yyminor /* The minor type of the error token */
){ ){
ParseARG_FETCH; ParseARG_FETCH
ParseCTX_FETCH
#define TOKEN yyminor #define TOKEN yyminor
/************ Begin %syntax_error code ****************************************/ /************ Begin %syntax_error code ****************************************/
...@@ -3112,7 +3421,8 @@ static void yy_syntax_error( ...@@ -3112,7 +3421,8 @@ static void yy_syntax_error(
assert(len <= outputBufLen); assert(len <= outputBufLen);
/************ End %syntax_error code ******************************************/ /************ End %syntax_error code ******************************************/
ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */ ParseARG_STORE /* Suppress warning about unused %extra_argument variable */
ParseCTX_STORE
} }
/* /*
...@@ -3121,7 +3431,8 @@ static void yy_syntax_error( ...@@ -3121,7 +3431,8 @@ static void yy_syntax_error(
static void yy_accept( static void yy_accept(
yyParser *yypParser /* The parser */ yyParser *yypParser /* The parser */
){ ){
ParseARG_FETCH; ParseARG_FETCH
ParseCTX_FETCH
#ifndef NDEBUG #ifndef NDEBUG
if( yyTraceFILE ){ if( yyTraceFILE ){
fprintf(yyTraceFILE,"%sAccept!\n",yyTracePrompt); fprintf(yyTraceFILE,"%sAccept!\n",yyTracePrompt);
...@@ -3136,7 +3447,8 @@ static void yy_accept( ...@@ -3136,7 +3447,8 @@ static void yy_accept(
/*********** Begin %parse_accept code *****************************************/ /*********** Begin %parse_accept code *****************************************/
/*********** End %parse_accept code *******************************************/ /*********** End %parse_accept code *******************************************/
ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */ ParseARG_STORE /* Suppress warning about unused %extra_argument variable */
ParseCTX_STORE
} }
/* The main parser program. /* The main parser program.
...@@ -3165,45 +3477,47 @@ void Parse( ...@@ -3165,45 +3477,47 @@ void Parse(
ParseARG_PDECL /* Optional %extra_argument parameter */ ParseARG_PDECL /* Optional %extra_argument parameter */
){ ){
YYMINORTYPE yyminorunion; YYMINORTYPE yyminorunion;
unsigned int yyact; /* The parser action. */ YYACTIONTYPE yyact; /* The parser action. */
#if !defined(YYERRORSYMBOL) && !defined(YYNOERRORRECOVERY) #if !defined(YYERRORSYMBOL) && !defined(YYNOERRORRECOVERY)
int yyendofinput; /* True if we are at the end of input */ int yyendofinput; /* True if we are at the end of input */
#endif #endif
#ifdef YYERRORSYMBOL #ifdef YYERRORSYMBOL
int yyerrorhit = 0; /* True if yymajor has invoked an error */ int yyerrorhit = 0; /* True if yymajor has invoked an error */
#endif #endif
yyParser *yypParser; /* The parser */ yyParser *yypParser = (yyParser*)yyp; /* The parser */
ParseCTX_FETCH
ParseARG_STORE
yypParser = (yyParser*)yyp;
assert( yypParser->yytos!=0 ); assert( yypParser->yytos!=0 );
#if !defined(YYERRORSYMBOL) && !defined(YYNOERRORRECOVERY) #if !defined(YYERRORSYMBOL) && !defined(YYNOERRORRECOVERY)
yyendofinput = (yymajor==0); yyendofinput = (yymajor==0);
#endif #endif
ParseARG_STORE;
yyact = yypParser->yytos->stateno;
#ifndef NDEBUG #ifndef NDEBUG
if( yyTraceFILE ){ if( yyTraceFILE ){
int stateno = yypParser->yytos->stateno; if( yyact < YY_MIN_REDUCE ){
if( stateno < YY_MIN_REDUCE ){
fprintf(yyTraceFILE,"%sInput '%s' in state %d\n", fprintf(yyTraceFILE,"%sInput '%s' in state %d\n",
yyTracePrompt,yyTokenName[yymajor],stateno); yyTracePrompt,yyTokenName[yymajor],yyact);
}else{ }else{
fprintf(yyTraceFILE,"%sInput '%s' with pending reduce %d\n", fprintf(yyTraceFILE,"%sInput '%s' with pending reduce %d\n",
yyTracePrompt,yyTokenName[yymajor],stateno-YY_MIN_REDUCE); yyTracePrompt,yyTokenName[yymajor],yyact-YY_MIN_REDUCE);
} }
} }
#endif #endif
do{ do{
yyact = yy_find_shift_action(yypParser,(YYCODETYPE)yymajor); assert( yyact==yypParser->yytos->stateno );
yyact = yy_find_shift_action((YYCODETYPE)yymajor,yyact);
if( yyact >= YY_MIN_REDUCE ){ if( yyact >= YY_MIN_REDUCE ){
yy_reduce(yypParser,yyact-YY_MIN_REDUCE,yymajor,yyminor); yyact = yy_reduce(yypParser,yyact-YY_MIN_REDUCE,yymajor,
yyminor ParseCTX_PARAM);
}else if( yyact <= YY_MAX_SHIFTREDUCE ){ }else if( yyact <= YY_MAX_SHIFTREDUCE ){
yy_shift(yypParser,yyact,yymajor,yyminor); yy_shift(yypParser,yyact,(YYCODETYPE)yymajor,yyminor);
#ifndef YYNOERRORRECOVERY #ifndef YYNOERRORRECOVERY
yypParser->yyerrcnt--; yypParser->yyerrcnt--;
#endif #endif
yymajor = YYNOCODE; break;
}else if( yyact==YY_ACCEPT_ACTION ){ }else if( yyact==YY_ACCEPT_ACTION ){
yypParser->yytos--; yypParser->yytos--;
yy_accept(yypParser); yy_accept(yypParser);
...@@ -3254,10 +3568,9 @@ void Parse( ...@@ -3254,10 +3568,9 @@ void Parse(
yymajor = YYNOCODE; yymajor = YYNOCODE;
}else{ }else{
while( yypParser->yytos >= yypParser->yystack while( yypParser->yytos >= yypParser->yystack
&& yymx != YYERRORSYMBOL
&& (yyact = yy_find_reduce_action( && (yyact = yy_find_reduce_action(
yypParser->yytos->stateno, yypParser->yytos->stateno,
YYERRORSYMBOL)) >= YY_MIN_REDUCE YYERRORSYMBOL)) > YY_MAX_SHIFTREDUCE
){ ){
yy_pop_parser_stack(yypParser); yy_pop_parser_stack(yypParser);
} }
...@@ -3274,6 +3587,8 @@ void Parse( ...@@ -3274,6 +3587,8 @@ void Parse(
} }
yypParser->yyerrcnt = 3; yypParser->yyerrcnt = 3;
yyerrorhit = 1; yyerrorhit = 1;
if( yymajor==YYNOCODE ) break;
yyact = yypParser->yytos->stateno;
#elif defined(YYNOERRORRECOVERY) #elif defined(YYNOERRORRECOVERY)
/* If the YYNOERRORRECOVERY macro is defined, then do not attempt to /* If the YYNOERRORRECOVERY macro is defined, then do not attempt to
** do any kind of error recovery. Instead, simply invoke the syntax ** do any kind of error recovery. Instead, simply invoke the syntax
...@@ -3284,8 +3599,7 @@ void Parse( ...@@ -3284,8 +3599,7 @@ void Parse(
*/ */
yy_syntax_error(yypParser,yymajor, yyminor); yy_syntax_error(yypParser,yymajor, yyminor);
yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion); yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion);
yymajor = YYNOCODE; break;
#else /* YYERRORSYMBOL is not defined */ #else /* YYERRORSYMBOL is not defined */
/* This is what we do if the grammar does not define ERROR: /* This is what we do if the grammar does not define ERROR:
** **
...@@ -3307,10 +3621,10 @@ void Parse( ...@@ -3307,10 +3621,10 @@ void Parse(
yypParser->yyerrcnt = -1; yypParser->yyerrcnt = -1;
#endif #endif
} }
yymajor = YYNOCODE; break;
#endif #endif
} }
}while( yymajor!=YYNOCODE && yypParser->yytos>yypParser->yystack ); }while( yypParser->yytos>yypParser->yystack );
#ifndef NDEBUG #ifndef NDEBUG
if( yyTraceFILE ){ if( yyTraceFILE ){
yyStackEntry *i; yyStackEntry *i;
...@@ -3325,3 +3639,17 @@ void Parse( ...@@ -3325,3 +3639,17 @@ void Parse(
#endif #endif
return; return;
} }
/*
** Return the fallback token corresponding to canonical token iToken, or
** 0 if iToken has no fallback.
*/
int ParseFallback(int iToken){
#ifdef YYFALLBACK
assert( iToken<(int)(sizeof(yyFallback)/sizeof(yyFallback[0])) );
return yyFallback[iToken];
#else
(void)iToken;
return 0;
#endif
}
...@@ -50,7 +50,8 @@ int tsdbCreateTable(STsdbRepo *repo, STableCfg *pCfg) { ...@@ -50,7 +50,8 @@ int tsdbCreateTable(STsdbRepo *repo, STableCfg *pCfg) {
STsdbMeta *pMeta = pRepo->tsdbMeta; STsdbMeta *pMeta = pRepo->tsdbMeta;
STable * super = NULL; STable * super = NULL;
STable * table = NULL; STable * table = NULL;
int newSuper = 0; bool newSuper = false;
bool superChanged = false;
int tid = pCfg->tableId.tid; int tid = pCfg->tableId.tid;
STable * pTable = NULL; STable * pTable = NULL;
...@@ -85,7 +86,7 @@ int tsdbCreateTable(STsdbRepo *repo, STableCfg *pCfg) { ...@@ -85,7 +86,7 @@ int tsdbCreateTable(STsdbRepo *repo, STableCfg *pCfg) {
if (pCfg->type == TSDB_CHILD_TABLE) { if (pCfg->type == TSDB_CHILD_TABLE) {
super = tsdbGetTableByUid(pMeta, pCfg->superUid); super = tsdbGetTableByUid(pMeta, pCfg->superUid);
if (super == NULL) { // super table not exists, try to create it if (super == NULL) { // super table not exists, try to create it
newSuper = 1; newSuper = true;
super = tsdbCreateTableFromCfg(pCfg, true); super = tsdbCreateTableFromCfg(pCfg, true);
if (super == NULL) goto _err; if (super == NULL) goto _err;
} else { } else {
...@@ -93,6 +94,17 @@ int tsdbCreateTable(STsdbRepo *repo, STableCfg *pCfg) { ...@@ -93,6 +94,17 @@ int tsdbCreateTable(STsdbRepo *repo, STableCfg *pCfg) {
terrno = TSDB_CODE_TDB_IVD_CREATE_TABLE_INFO; terrno = TSDB_CODE_TDB_IVD_CREATE_TABLE_INFO;
goto _err; goto _err;
} }
if (schemaVersion(pCfg->tagSchema) > schemaVersion(super->tagSchema)) {
// tag schema out of date, need to update super table tag version
STSchema *pOldSchema = super->tagSchema;
TSDB_WLOCK_TABLE(super);
super->tagSchema = tdDupSchema(pCfg->tagSchema);
TSDB_WUNLOCK_TABLE(super);
tdFreeSchema(pOldSchema);
superChanged = true;
}
} }
} }
...@@ -117,7 +129,7 @@ int tsdbCreateTable(STsdbRepo *repo, STableCfg *pCfg) { ...@@ -117,7 +129,7 @@ int tsdbCreateTable(STsdbRepo *repo, STableCfg *pCfg) {
// TODO: refactor duplicate codes // TODO: refactor duplicate codes
int tlen = 0; int tlen = 0;
void *pBuf = NULL; void *pBuf = NULL;
if (newSuper) { if (newSuper || superChanged) {
tlen = tsdbGetTableEncodeSize(TSDB_UPDATE_META, super); tlen = tsdbGetTableEncodeSize(TSDB_UPDATE_META, super);
pBuf = tsdbAllocBytes(pRepo, tlen); pBuf = tsdbAllocBytes(pRepo, tlen);
if (pBuf == NULL) goto _err; if (pBuf == NULL) goto _err;
......
CMAKE_MINIMUM_REQUIRED(VERSION 2.8) CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(TDengine) PROJECT(TDengine)
ADD_DEFINITIONS(-DWAL_CHECKSUM_WHOLE)
INCLUDE_DIRECTORIES(inc) INCLUDE_DIRECTORIES(inc)
AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/src SRC) AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/src SRC)
......
...@@ -111,6 +111,28 @@ void walRemoveAllOldFiles(void *handle) { ...@@ -111,6 +111,28 @@ void walRemoveAllOldFiles(void *handle) {
pthread_mutex_unlock(&pWal->mutex); pthread_mutex_unlock(&pWal->mutex);
} }
#if defined(WAL_CHECKSUM_WHOLE)
static void walUpdateChecksum(SWalHead *pHead) {
pHead->sver = 1;
pHead->cksum = 0;
pHead->cksum = taosCalcChecksum(0, (uint8_t *)pHead, sizeof(*pHead) + pHead->len);
}
static int walValidateChecksum(SWalHead *pHead) {
if (pHead->sver == 0) { // for compatible with wal before sver 1
return taosCheckChecksumWhole((uint8_t *)pHead, sizeof(*pHead));
} else if (pHead->sver == 1) {
uint32_t cksum = pHead->cksum;
pHead->cksum = 0;
return taosCheckChecksum((uint8_t *)pHead, sizeof(*pHead) + pHead->len, cksum);
}
return 0;
}
#endif
int32_t walWrite(void *handle, SWalHead *pHead) { int32_t walWrite(void *handle, SWalHead *pHead) {
if (handle == NULL) return -1; if (handle == NULL) return -1;
...@@ -123,7 +145,13 @@ int32_t walWrite(void *handle, SWalHead *pHead) { ...@@ -123,7 +145,13 @@ int32_t walWrite(void *handle, SWalHead *pHead) {
if (pHead->version <= pWal->version) return 0; if (pHead->version <= pWal->version) return 0;
pHead->signature = WAL_SIGNATURE; pHead->signature = WAL_SIGNATURE;
#if defined(WAL_CHECKSUM_WHOLE)
walUpdateChecksum(pHead);
#else
pHead->sver = 0;
taosCalcChecksumAppend(0, (uint8_t *)pHead, sizeof(SWalHead)); taosCalcChecksumAppend(0, (uint8_t *)pHead, sizeof(SWalHead));
#endif
int32_t contLen = pHead->len + sizeof(SWalHead); int32_t contLen = pHead->len + sizeof(SWalHead);
pthread_mutex_lock(&pWal->mutex); pthread_mutex_lock(&pWal->mutex);
...@@ -246,16 +274,40 @@ static int32_t walSkipCorruptedRecord(SWal *pWal, SWalHead *pHead, int64_t tfd, ...@@ -246,16 +274,40 @@ static int32_t walSkipCorruptedRecord(SWal *pWal, SWalHead *pHead, int64_t tfd,
continue; continue;
} }
#if defined(WAL_CHECKSUM_WHOLE)
if (pHead->sver == 0 && walValidateChecksum(pHead)) {
wInfo("vgId:%d, wal head cksum check passed, offset:%" PRId64, pWal->vgId, pos);
*offset = pos;
return TSDB_CODE_SUCCESS;
}
if (pHead->sver == 1) {
if (tfRead(tfd, pHead->cont, pHead->len) < pHead->len) {
wError("vgId:%d, read to end of corrupted wal file, offset:%" PRId64, pWal->vgId, pos);
return TSDB_CODE_WAL_FILE_CORRUPTED;
}
if (walValidateChecksum(pHead)) {
wInfo("vgId:%d, wal whole cksum check passed, offset:%" PRId64, pWal->vgId, pos);
*offset = pos;
return TSDB_CODE_SUCCESS;
}
}
#else
if (taosCheckChecksumWhole((uint8_t *)pHead, sizeof(SWalHead))) { if (taosCheckChecksumWhole((uint8_t *)pHead, sizeof(SWalHead))) {
wInfo("vgId:%d, wal head cksum check passed, offset:%" PRId64, pWal->vgId, pos); wInfo("vgId:%d, wal head cksum check passed, offset:%" PRId64, pWal->vgId, pos);
*offset = pos; *offset = pos;
return TSDB_CODE_SUCCESS; return TSDB_CODE_SUCCESS;
} }
#endif
} }
return TSDB_CODE_WAL_FILE_CORRUPTED; return TSDB_CODE_WAL_FILE_CORRUPTED;
} }
static int32_t walRestoreWalFile(SWal *pWal, void *pVnode, FWalWrite writeFp, char *name, int64_t fileId) { static int32_t walRestoreWalFile(SWal *pWal, void *pVnode, FWalWrite writeFp, char *name, int64_t fileId) {
int32_t size = WAL_MAX_SIZE; int32_t size = WAL_MAX_SIZE;
void * buffer = tmalloc(size); void * buffer = tmalloc(size);
...@@ -293,6 +345,51 @@ static int32_t walRestoreWalFile(SWal *pWal, void *pVnode, FWalWrite writeFp, ch ...@@ -293,6 +345,51 @@ static int32_t walRestoreWalFile(SWal *pWal, void *pVnode, FWalWrite writeFp, ch
break; break;
} }
#if defined(WAL_CHECKSUM_WHOLE)
if (pHead->sver == 0 && !walValidateChecksum(pHead)) {
wError("vgId:%d, file:%s, wal head cksum is messed up, hver:%" PRIu64 " len:%d offset:%" PRId64, pWal->vgId, name,
pHead->version, pHead->len, offset);
code = walSkipCorruptedRecord(pWal, pHead, tfd, &offset);
if (code != TSDB_CODE_SUCCESS) {
walFtruncate(pWal, tfd, offset);
break;
}
}
if (pHead->len < 0 || pHead->len > size - sizeof(SWalHead)) {
wError("vgId:%d, file:%s, wal head len out of range, hver:%" PRIu64 " len:%d offset:%" PRId64, pWal->vgId, name,
pHead->version, pHead->len, offset);
code = walSkipCorruptedRecord(pWal, pHead, tfd, &offset);
if (code != TSDB_CODE_SUCCESS) {
walFtruncate(pWal, tfd, offset);
break;
}
}
ret = (int32_t)tfRead(tfd, pHead->cont, pHead->len);
if (ret < 0) {
wError("vgId:%d, file:%s, failed to read wal body since %s", pWal->vgId, name, strerror(errno));
code = TAOS_SYSTEM_ERROR(errno);
break;
}
if (ret < pHead->len) {
wError("vgId:%d, file:%s, failed to read wal body, ret:%d len:%d", pWal->vgId, name, ret, pHead->len);
offset += sizeof(SWalHead);
continue;
}
if (pHead->sver == 1 && !walValidateChecksum(pHead)) {
wError("vgId:%d, file:%s, wal whole cksum is messed up, hver:%" PRIu64 " len:%d offset:%" PRId64, pWal->vgId, name,
pHead->version, pHead->len, offset);
code = walSkipCorruptedRecord(pWal, pHead, tfd, &offset);
if (code != TSDB_CODE_SUCCESS) {
walFtruncate(pWal, tfd, offset);
break;
}
}
#else
if (!taosCheckChecksumWhole((uint8_t *)pHead, sizeof(SWalHead))) { if (!taosCheckChecksumWhole((uint8_t *)pHead, sizeof(SWalHead))) {
wError("vgId:%d, file:%s, wal head cksum is messed up, hver:%" PRIu64 " len:%d offset:%" PRId64, pWal->vgId, name, wError("vgId:%d, file:%s, wal head cksum is messed up, hver:%" PRIu64 " len:%d offset:%" PRId64, pWal->vgId, name,
pHead->version, pHead->len, offset); pHead->version, pHead->len, offset);
...@@ -326,6 +423,7 @@ static int32_t walRestoreWalFile(SWal *pWal, void *pVnode, FWalWrite writeFp, ch ...@@ -326,6 +423,7 @@ static int32_t walRestoreWalFile(SWal *pWal, void *pVnode, FWalWrite writeFp, ch
continue; continue;
} }
#endif
offset = offset + sizeof(SWalHead) + pHead->len; offset = offset + sizeof(SWalHead) + pHead->len;
wTrace("vgId:%d, restore wal, fileId:%" PRId64 " hver:%" PRIu64 " wver:%" PRIu64 " len:%d", pWal->vgId, wTrace("vgId:%d, restore wal, fileId:%" PRId64 " hver:%" PRIu64 " wver:%" PRIu64 " len:%d", pWal->vgId,
......
...@@ -109,6 +109,13 @@ pipeline { ...@@ -109,6 +109,13 @@ pipeline {
java --class-path=../../../../src/connector/jdbc/target:$JAVA_HOME/jre/lib/ext -jar target/JDBCDemo-SNAPSHOT-jar-with-dependencies.jar -host 127.0.0.1 java --class-path=../../../../src/connector/jdbc/target:$JAVA_HOME/jre/lib/ext -jar target/JDBCDemo-SNAPSHOT-jar-with-dependencies.jar -host 127.0.0.1
''' '''
} }
catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
sh '''
cp -rf ${WKC}/tests/examples/nodejs ${JENKINS_HOME}/workspace/
cd ${JENKINS_HOME}/workspace/nodejs
node nodejsChecker.js host=localhost
'''
}
catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') { catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
sh ''' sh '''
cd ${JENKINS_HOME}/workspace/C#NET/src/CheckC# cd ${JENKINS_HOME}/workspace/C#NET/src/CheckC#
......
...@@ -62,7 +62,10 @@ int main(int argc, char *argv[]) { ...@@ -62,7 +62,10 @@ int main(int argc, char *argv[]) {
} }
// init TAOS // init TAOS
taos_init(); if (taos_init()) {
exit(1);
}
TAOS *taos = taos_connect(argv[1], "root", "taosdata", NULL, 0); TAOS *taos = taos_connect(argv[1], "root", "taosdata", NULL, 0);
if (taos == NULL) { if (taos == NULL) {
printf("failed to connect to server, reason:%s\n", "null taos"/*taos_errstr(taos)*/); printf("failed to connect to server, reason:%s\n", "null taos"/*taos_errstr(taos)*/);
......
...@@ -23,7 +23,10 @@ int main(int argc, char *argv[]) ...@@ -23,7 +23,10 @@ int main(int argc, char *argv[])
} }
// init TAOS // init TAOS
taos_init(); if (taos_init()) {
printf("failed to init taos\n");
exit(1);
}
taos = taos_connect(argv[1], "root", "taosdata", NULL, 0); taos = taos_connect(argv[1], "root", "taosdata", NULL, 0);
if (taos == NULL) { if (taos == NULL) {
......
...@@ -55,7 +55,10 @@ int main(int argc, char *argv[]) ...@@ -55,7 +55,10 @@ int main(int argc, char *argv[])
} }
// init TAOS // init TAOS
taos_init(); if (taos_init()) {
printf("failed to init taos\n");
exit(1);
}
strcpy(db_name, argv[2]); strcpy(db_name, argv[2]);
strcpy(tbl_name, argv[3]); strcpy(tbl_name, argv[3]);
......
...@@ -217,7 +217,10 @@ int main(int argc, char *argv[]) { ...@@ -217,7 +217,10 @@ int main(int argc, char *argv[]) {
} }
// init TAOS // init TAOS
taos_init(); if (taos_init()) {
printf("failed to init taos\n");
exit(1);
}
TAOS* taos = taos_connect(host, user, passwd, "", 0); TAOS* taos = taos_connect(host, user, passwd, "", 0);
if (taos == NULL) { if (taos == NULL) {
......
Subproject commit 1c8924dc668e6aa848214c2fc54e3ace3f5bf8df
...@@ -39,6 +39,8 @@ function buildTDengine { ...@@ -39,6 +39,8 @@ function buildTDengine {
cd $WORK_DIR/TDengine cd $WORK_DIR/TDengine
git remote update > /dev/null git remote update > /dev/null
git reset --hard HEAD
git checkout develop
REMOTE_COMMIT=`git rev-parse --short remotes/origin/develop` REMOTE_COMMIT=`git rev-parse --short remotes/origin/develop`
LOCAL_COMMIT=`git rev-parse --short @` LOCAL_COMMIT=`git rev-parse --short @`
...@@ -54,15 +56,16 @@ function buildTDengine { ...@@ -54,15 +56,16 @@ function buildTDengine {
cd debug cd debug
rm -rf * rm -rf *
cmake .. > /dev/null cmake .. > /dev/null
make > /dev/null make && make install > /dev/null
make install
fi fi
} }
function runQueryPerfTest { function runQueryPerfTest {
[ -f $PERFORMANCE_TEST_REPORT ] && rm $PERFORMANCE_TEST_REPORT [ -f $PERFORMANCE_TEST_REPORT ] && rm $PERFORMANCE_TEST_REPORT
nohup $WORK_DIR/TDengine/debug/build/bin/taosd -c /etc/taosperf/ > /dev/null 2>&1 & nohup $WORK_DIR/TDengine/debug/build/bin/taosd -c /etc/taosperf/ > /dev/null 2>&1 &
echoInfo "Run Performance Test" echoInfo "Wait TDengine to start"
sleep 60
echoInfo "Run Performance Test"
cd $WORK_DIR/TDengine/tests/pytest cd $WORK_DIR/TDengine/tests/pytest
python3 query/queryPerformance.py -c $LOCAL_COMMIT | tee -a $PERFORMANCE_TEST_REPORT python3 query/queryPerformance.py -c $LOCAL_COMMIT | tee -a $PERFORMANCE_TEST_REPORT
...@@ -104,6 +107,7 @@ function sendReport { ...@@ -104,6 +107,7 @@ function sendReport {
stopTaosd stopTaosd
buildTDengine buildTDengine
runQueryPerfTest runQueryPerfTest
stopTaosd
echoInfo "Send Report" echoInfo "Send Report"
sendReport sendReport
......
...@@ -2,15 +2,20 @@ FROM ubuntu:latest AS builder ...@@ -2,15 +2,20 @@ FROM ubuntu:latest AS builder
ARG PACKAGE=TDengine-server-1.6.5.10-Linux-x64.tar.gz ARG PACKAGE=TDengine-server-1.6.5.10-Linux-x64.tar.gz
ARG EXTRACTDIR=TDengine-enterprise-server ARG EXTRACTDIR=TDengine-enterprise-server
ARG TARBITRATORPKG=TDengine-tarbitrator-1.6.5.10-Linux-x64.tar.gz
ARG EXTRACTDIR2=TDengine-enterprise-arbitrator
ARG CONTENT=taos.tar.gz ARG CONTENT=taos.tar.gz
WORKDIR /root WORKDIR /root
COPY ${PACKAGE} . COPY ${PACKAGE} .
COPY ${TARBITRATORPKG} .
RUN tar -zxf ${PACKAGE} RUN tar -zxf ${PACKAGE}
RUN tar -zxf ${TARBITRATORPKG}
RUN mv ${EXTRACTDIR}/driver ./lib RUN mv ${EXTRACTDIR}/driver ./lib
RUN tar -zxf ${EXTRACTDIR}/${CONTENT} RUN tar -zxf ${EXTRACTDIR}/${CONTENT}
RUN mv ${EXTRACTDIR2}/bin/* /root/bin
FROM ubuntu:latest FROM ubuntu:latest
...@@ -19,8 +24,10 @@ WORKDIR /root ...@@ -19,8 +24,10 @@ WORKDIR /root
RUN apt-get update RUN apt-get update
RUN apt-get install -y vim tmux net-tools RUN apt-get install -y vim tmux net-tools
RUN echo 'alias ll="ls -l --color=auto"' >> /root/.bashrc RUN echo 'alias ll="ls -l --color=auto"' >> /root/.bashrc
RUN ulimit -c unlimited
COPY --from=builder /root/bin/taosd /usr/bin COPY --from=builder /root/bin/taosd /usr/bin
COPY --from=builder /root/bin/tarbitrator /usr/bin
COPY --from=builder /root/bin/taos /usr/bin COPY --from=builder /root/bin/taos /usr/bin
COPY --from=builder /root/cfg/taos.cfg /etc/taos/ COPY --from=builder /root/cfg/taos.cfg /etc/taos/
COPY --from=builder /root/lib/libtaos.so.* /usr/lib/libtaos.so.1 COPY --from=builder /root/lib/libtaos.so.* /usr/lib/libtaos.so.1
...@@ -29,8 +36,8 @@ ENV LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/lib" ...@@ -29,8 +36,8 @@ ENV LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/lib"
ENV LC_CTYPE=en_US.UTF-8 ENV LC_CTYPE=en_US.UTF-8
ENV LANG=en_US.UTF-8 ENV LANG=en_US.UTF-8
EXPOSE 6030-6041/tcp 6060/tcp 6030-6039/udp EXPOSE 6030-6042/tcp 6060/tcp 6030-6039/udp
# VOLUME [ "/var/lib/taos", "/var/log/taos", "/etc/taos" ] # VOLUME [ "/var/lib/taos", "/var/log/taos", "/etc/taos" ]
CMD [ "bash" ] CMD [ "bash" ]
\ No newline at end of file
...@@ -12,15 +12,89 @@ ...@@ -12,15 +12,89 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import os import os
import taos
import random import random
import argparse
class ClusterTestcase: class BuildDockerCluser:
def __init__(self, hostName, user, password, configDir, numOfNodes, clusterVersion):
self.hostName = hostName
self.user = user
self.password = password
self.configDir = configDir
self.numOfNodes = numOfNodes
self.clusterVersion = clusterVersion
def getConnection(self):
self.conn = taos.connect(
host = self.hostName,
user = self.user,
password = self.password,
config = self.configDir)
def createDondes(self):
self.cursor = self.conn.cursor()
for i in range(2, self.numOfNodes + 1):
self.cursor.execute("create dnode tdnode%d" % i)
def startArbitrator(self):
print("start arbitrator")
os.system("docker exec -d $(docker ps|grep tdnode1|awk '{print $1}') tarbitrator")
def run(self): def run(self):
os.system("./buildClusterEnv.sh -n 3 -v 2.0.14.1") if self.numOfNodes < 2 or self.numOfNodes > 5:
os.system("yes|taosdemo -h 172.27.0.7 -n 100 -t 100 -x") print("the number of nodes must be between 2 and 5")
os.system("python3 ../../concurrent_inquiry.py -H 172.27.0.7 -T 4 -t 4 -l 10") exit(0)
os.system("./buildClusterEnv.sh -n %d -v %s" % (self.numOfNodes, self.clusterVersion))
self.getConnection()
self.createDondes()
self.startArbitrator()
parser = argparse.ArgumentParser()
parser.add_argument(
'-H',
'--host',
action='store',
default='tdnode1',
type=str,
help='host name to be connected (default: tdnode1)')
parser.add_argument(
'-u',
'--user',
action='store',
default='root',
type=str,
help='user (default: root)')
parser.add_argument(
'-p',
'--password',
action='store',
default='taosdata',
type=str,
help='password (default: taosdata)')
parser.add_argument(
'-c',
'--config-dir',
action='store',
default='/etc/taos',
type=str,
help='configuration directory (default: /etc/taos)')
parser.add_argument(
'-n',
'--num-of-nodes',
action='store',
default=2,
type=int,
help='number of nodes in the cluster (default: 2, min: 2, max: 5)')
parser.add_argument(
'-v',
'--version',
action='store',
default='2.0.14.1',
type=str,
help='the version of the cluster to be build, Default is 2.0.14.1')
clusterTest = ClusterTestcase() args = parser.parse_args()
clusterTest.run() cluster = BuildDockerCluser(args.host, args.user, args.password, args.config_dir, args.num_of_nodes, args.version)
\ No newline at end of file cluster.run()
\ No newline at end of file
...@@ -27,18 +27,28 @@ do ...@@ -27,18 +27,28 @@ do
esac esac
done done
function addTaoscfg {
for i in {1..5}
do
touch /data/node$i/cfg/taos.cfg
echo 'firstEp tdnode1:6030' > /data/node$i/cfg/taos.cfg
echo 'fqdn tdnode'$i >> /data/node$i/cfg/taos.cfg
echo 'arbitrator tdnode1:6042' >> /data/node$i/cfg/taos.cfg
done
}
function createDIR { function createDIR {
for i in {1.. $2} for i in {1..5}
do do
mkdir -p /data/node$i/data mkdir -p /data/node$i/data
mkdir -p /data/node$i/log mkdir -p /data/node$i/log
mkdir -p /data/node$i/cfg mkdir -p /data/node$i/cfg
mkdir -p /data/node$i/core
done done
} }
function cleanEnv { function cleanEnv {
for i in {1..3} for i in {1..5}
do do
echo /data/node$i/data/* echo /data/node$i/data/*
rm -rf /data/node$i/data/* rm -rf /data/node$i/data/*
...@@ -54,49 +64,60 @@ function prepareBuild { ...@@ -54,49 +64,60 @@ function prepareBuild {
rm -rf $CURR_DIR/../../../../release/* rm -rf $CURR_DIR/../../../../release/*
fi fi
cd $CURR_DIR/../../../../packaging if [ ! -e $DOCKER_DIR/TDengine-server-$VERSION-Linux-x64.tar.gz ] || [ ! -e $DOCKER_DIR/TDengine-arbitrator-$VERSION-Linux-x64.tar.gz ]; then
./release.sh -v edge -n $VERSION >> /dev/null cd $CURR_DIR/../../../../packaging
echo "generating TDeninger packages"
./release.sh -v edge -n $VERSION >> /dev/null
if [ ! -f $CURR_DIR/../../../../release/TDengine-server-$VERSION-Linux-x64.tar.gz ]; then if [ ! -e $CURR_DIR/../../../../release/TDengine-server-$VERSION-Linux-x64.tar.gz ]; then
echo "no TDengine install package found" echo "no TDengine install package found"
exit 1 exit 1
fi fi
if [ ! -e $CURR_DIR/../../../../release/TDengine-arbitrator-$VERSION-Linux-x64.tar.gz ]; then
echo "no arbitrator install package found"
exit 1
fi
cd $CURR_DIR/../../../../release cd $CURR_DIR/../../../../release
mv TDengine-server-$VERSION-Linux-x64.tar.gz $DOCKER_DIR mv TDengine-server-$VERSION-Linux-x64.tar.gz $DOCKER_DIR
mv TDengine-arbitrator-$VERSION-Linux-x64.tar.gz $DOCKER_DIR
fi
rm -rf $DOCKER_DIR/*.yml rm -rf $DOCKER_DIR/*.yml
cd $CURR_DIR cd $CURR_DIR
cp docker-compose.yml $DOCKER_DIR cp *.yml $DOCKER_DIR
cp Dockerfile $DOCKER_DIR cp Dockerfile $DOCKER_DIR
if [ $NUM_OF_NODES -eq 4 ]; then
cp ../node4.yml $DOCKER_DIR
fi
if [ $NUM_OF_NODES -eq 5 ]; then
cp ../node5.yml $DOCKER_DIR
fi
} }
function clusterUp { function clusterUp {
echo "docker compose start"
cd $DOCKER_DIR cd $DOCKER_DIR
if [ $NUM_OF_NODES -eq 2 ]; then
echo "create 2 dnodes"
PACKAGE=TDengine-server-$VERSION-Linux-x64.tar.gz DIR=TDengine-server-$VERSION DIR2=TDengine-arbitrator-$VERSION VERSION=$VERSION docker-compose up -d
fi
if [ $NUM_OF_NODES -eq 3 ]; then if [ $NUM_OF_NODES -eq 3 ]; then
PACKAGE=TDengine-server-$VERSION-Linux-x64.tar.gz DIR=TDengine-server-$VERSION VERSION=$VERSION docker-compose up -d PACKAGE=TDengine-server-$VERSION-Linux-x64.tar.gz DIR=TDengine-server-$VERSION DIR2=TDengine-arbitrator-$VERSION VERSION=$VERSION docker-compose -f docker-compose.yml -f node3.yml up -d
fi fi
if [ $NUM_OF_NODES -eq 4 ]; then if [ $NUM_OF_NODES -eq 4 ]; then
PACKAGE=TDengine-server-$VERSION-Linux-x64.tar.gz DIR=TDengine-server-$VERSION VERSION=$VERSION docker-compose -f docker-compose.yml -f node4.yml up -d PACKAGE=TDengine-server-$VERSION-Linux-x64.tar.gz DIR=TDengine-server-$VERSION DIR2=TDengine-arbitrator-$VERSION VERSION=$VERSION docker-compose -f docker-compose.yml -f node3.yml -f node4.yml up -d
fi fi
if [ $NUM_OF_NODES -eq 5 ]; then if [ $NUM_OF_NODES -eq 5 ]; then
PACKAGE=TDengine-server-$VERSION-Linux-x64.tar.gz DIR=TDengine-server-$VERSION VERSION=$VERSION docker-compose -f docker-compose.yml -f node4.yml -f node5.yml up -d PACKAGE=TDengine-server-$VERSION-Linux-x64.tar.gz DIR=TDengine-server-$VERSION DIR2=TDengine-arbitrator-$VERSION VERSION=$VERSION docker-compose -f docker-compose.yml -f node3.yml -f node4.yml -f node5.yml up -d
fi fi
echo "docker compose finish"
} }
cleanEnv createDIR
cleanEnv
addTaoscfg
prepareBuild prepareBuild
clusterUp clusterUp
\ No newline at end of file
version: '3.7' version: '3.7'
services: services:
td2.0-node1: td2.0-node1:
build: build:
context: . context: .
args: args:
- PACKAGE=${PACKAGE} - PACKAGE=${PACKAGE}
- TARBITRATORPKG=${TARBITRATORPKG}
- EXTRACTDIR=${DIR} - EXTRACTDIR=${DIR}
- EXTRACTDIR2=${DIR2}
image: 'tdengine:${VERSION}' image: 'tdengine:${VERSION}'
container_name: 'td2.0-node1' container_name: 'tdnode1'
cap_add: cap_add:
- ALL - ALL
stdin_open: true stdin_open: true
...@@ -18,7 +20,15 @@ services: ...@@ -18,7 +20,15 @@ services:
command: > command: >
sh -c "ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && sh -c "ln -snf /usr/share/zoneinfo/$TZ /etc/localtime &&
echo $TZ > /etc/timezone && echo $TZ > /etc/timezone &&
mkdir /coredump &&
echo 'kernel.core_pattern=/coredump/core_%e_%p' >> /etc/sysctl.conf &&
sysctl -p &&
exec my-main-application" exec my-main-application"
extra_hosts:
- "tdnode2:172.27.0.8"
- "tdnode3:172.27.0.9"
- "tdnode4:172.27.0.10"
- "tdnode5:172.27.0.11"
volumes: volumes:
# bind data directory # bind data directory
- type: bind - type: bind
...@@ -32,14 +42,18 @@ services: ...@@ -32,14 +42,18 @@ services:
- type: bind - type: bind
source: /data/node1/cfg source: /data/node1/cfg
target: /etc/taos target: /etc/taos
# bind core dump path
- type: bind
source: /data/node1/core
target: /coredump
- type: bind - type: bind
source: /data source: /data
target: /root target: /root
hostname: node1 hostname: tdnode1
networks: networks:
taos_update_net: taos_update_net:
ipv4_address: 172.27.0.7 ipv4_address: 172.27.0.7
command: taosd command: taosd
td2.0-node2: td2.0-node2:
build: build:
...@@ -48,7 +62,7 @@ services: ...@@ -48,7 +62,7 @@ services:
- PACKAGE=${PACKAGE} - PACKAGE=${PACKAGE}
- EXTRACTDIR=${DIR} - EXTRACTDIR=${DIR}
image: 'tdengine:${VERSION}' image: 'tdengine:${VERSION}'
container_name: 'td2.0-node2' container_name: 'tdnode2'
cap_add: cap_add:
- ALL - ALL
stdin_open: true stdin_open: true
...@@ -58,7 +72,15 @@ services: ...@@ -58,7 +72,15 @@ services:
command: > command: >
sh -c "ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && sh -c "ln -snf /usr/share/zoneinfo/$TZ /etc/localtime &&
echo $TZ > /etc/timezone && echo $TZ > /etc/timezone &&
mkdir /coredump &&
echo 'kernel.core_pattern=/coredump/core_%e_%p' >> /etc/sysctl.conf &&
sysctl -p &&
exec my-main-application" exec my-main-application"
extra_hosts:
- "tdnode1:172.27.0.7"
- "tdnode3:172.27.0.9"
- "tdnode4:172.27.0.10"
- "tdnode5:172.27.0.11"
volumes: volumes:
# bind data directory # bind data directory
- type: bind - type: bind
...@@ -72,52 +94,19 @@ services: ...@@ -72,52 +94,19 @@ services:
- type: bind - type: bind
source: /data/node2/cfg source: /data/node2/cfg
target: /etc/taos target: /etc/taos
# bind core dump path
- type: bind
source: /data/node2/core
target: /coredump
- type: bind - type: bind
source: /data source: /data
target: /root target: /root
hostname: tdnode2
networks: networks:
taos_update_net: taos_update_net:
ipv4_address: 172.27.0.8 ipv4_address: 172.27.0.8
command: taosd command: taosd
td2.0-node3:
build:
context: .
args:
- PACKAGE=${PACKAGE}
- EXTRACTDIR=${DIR}
image: 'tdengine:${VERSION}'
container_name: 'td2.0-node3'
cap_add:
- ALL
stdin_open: true
tty: true
environment:
TZ: "Asia/Shanghai"
command: >
sh -c "ln -snf /usr/share/zoneinfo/$TZ /etc/localtime &&
echo $TZ > /etc/timezone &&
exec my-main-application"
volumes:
# bind data directory
- type: bind
source: /data/node3/data
target: /var/lib/taos
# bind log directory
- type: bind
source: /data/node3/log
target: /var/log/taos
# bind configuration
- type: bind
source: /data/node3/cfg
target: /etc/taos
- type: bind
source: /data
target: /root
networks:
taos_update_net:
ipv4_address: 172.27.0.9
command: taosd
networks: networks:
taos_update_net: taos_update_net:
......
{
"filetype": "insert",
"cfgdir": "/etc/taos",
"host": "127.0.0.1",
"port": 6030,
"user": "root",
"password": "taosdata",
"thread_count": 4,
"thread_count_create_tbl": 1,
"result_file": "./insert_res.txt",
"confirm_parameter_prompt": "no",
"databases": [{
"dbinfo": {
"name": "db",
"drop": "no",
"replica": 1,
"days": 2,
"cache": 16,
"blocks": 8,
"precision": "ms",
"keep": 365,
"minRows": 100,
"maxRows": 4096,
"comp":2,
"walLevel":1,
"quorum":1,
"fsync":3000,
"update": 0
},
"super_tables": [{
"name": "stb",
"child_table_exists":"no",
"childtable_count": 1,
"childtable_prefix": "stb_",
"auto_create_table": "no",
"data_source": "rand",
"insert_mode": "taosc",
"insert_rate": 0,
"insert_rows": 100000,
"multi_thread_write_one_tbl": "no",
"number_of_tbl_in_one_sql": 1,
"rows_per_tbl": 100,
"max_sql_len": 1024000,
"disorder_ratio": 0,
"disorder_range": 1000,
"timestamp_step": 10,
"start_timestamp": "2020-10-01 00:00:00.000",
"sample_format": "csv",
"sample_file": "./sample.csv",
"tags_file": "",
"columns": [{"type": "INT"}, {"type": "DOUBLE", "count":10}, {"type": "BINARY", "len": 16, "count":3}, {"type": "BINARY", "len": 32, "count":6}],
"tags": [{"type": "TINYINT", "count":2}, {"type": "BINARY", "len": 16, "count":5}]
}]
}]
}
version: '3.7'
services:
td2.0-node3:
build:
context: .
args:
- PACKAGE=${PACKAGE}
- EXTRACTDIR=${DIR}
image: 'tdengine:${VERSION}'
container_name: 'tdnode3'
cap_add:
- ALL
stdin_open: true
tty: true
environment:
TZ: "Asia/Shanghai"
command: >
sh -c "ln -snf /usr/share/zoneinfo/$TZ /etc/localtime &&
echo $TZ > /etc/timezone &&
mkdir /coredump &&
echo 'kernel.core_pattern=/coredump/core_%e_%p' >> /etc/sysctl.conf &&
sysctl -p &&
exec my-main-application"
extra_hosts:
- "tdnode1:172.27.0.7"
- "tdnode2:172.27.0.8"
- "tdnode4:172.27.0.10"
- "tdnode5:172.27.0.11"
volumes:
# bind data directory
- type: bind
source: /data/node3/data
target: /var/lib/taos
# bind log directory
- type: bind
source: /data/node3/log
target: /var/log/taos
# bind configuration
- type: bind
source: /data/node3/cfg
target: /etc/taos
# bind core dump path
- type: bind
source: /data/node3/core
target: /coredump
- type: bind
source: /data
target: /root
hostname: tdnode3
networks:
taos_update_net:
ipv4_address: 172.27.0.9
command: taosd
\ No newline at end of file
...@@ -7,8 +7,8 @@ services: ...@@ -7,8 +7,8 @@ services:
args: args:
- PACKAGE=${PACKAGE} - PACKAGE=${PACKAGE}
- EXTRACTDIR=${DIR} - EXTRACTDIR=${DIR}
image: 'tdengine:2.0.13.1' image: 'tdengine:${VERSION}'
container_name: 'td2.0-node4' container_name: 'tdnode4'
cap_add: cap_add:
- ALL - ALL
stdin_open: true stdin_open: true
...@@ -18,7 +18,15 @@ services: ...@@ -18,7 +18,15 @@ services:
command: > command: >
sh -c "ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && sh -c "ln -snf /usr/share/zoneinfo/$TZ /etc/localtime &&
echo $TZ > /etc/timezone && echo $TZ > /etc/timezone &&
mkdir /coredump &&
echo 'kernel.core_pattern=/coredump/core_%e_%p' >> /etc/sysctl.conf &&
sysctl -p &&
exec my-main-application" exec my-main-application"
extra_hosts:
- "tdnode2:172.27.0.8"
- "tdnode3:172.27.0.9"
- "tdnode4:172.27.0.10"
- "tdnode5:172.27.0.11"
volumes: volumes:
# bind data directory # bind data directory
- type: bind - type: bind
...@@ -32,9 +40,14 @@ services: ...@@ -32,9 +40,14 @@ services:
- type: bind - type: bind
source: /data/node4/cfg source: /data/node4/cfg
target: /etc/taos target: /etc/taos
# bind core dump path
- type: bind
source: /data/node4/core
target: /coredump
- type: bind - type: bind
source: /data source: /data
target: /root target: /root
hostname: tdnode4
networks: networks:
taos_update_net: taos_update_net:
ipv4_address: 172.27.0.10 ipv4_address: 172.27.0.10
......
...@@ -7,8 +7,8 @@ services: ...@@ -7,8 +7,8 @@ services:
args: args:
- PACKAGE=${PACKAGE} - PACKAGE=${PACKAGE}
- EXTRACTDIR=${DIR} - EXTRACTDIR=${DIR}
image: 'tdengine:2.0.13.1' image: 'tdengine:${VERSION}'
container_name: 'td2.0-node5' container_name: 'tdnode5'
cap_add: cap_add:
- ALL - ALL
stdin_open: true stdin_open: true
...@@ -18,7 +18,15 @@ services: ...@@ -18,7 +18,15 @@ services:
command: > command: >
sh -c "ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && sh -c "ln -snf /usr/share/zoneinfo/$TZ /etc/localtime &&
echo $TZ > /etc/timezone && echo $TZ > /etc/timezone &&
mkdir /coredump &&
echo 'kernel.core_pattern=/coredump/core_%e_%p' >> /etc/sysctl.conf &&
sysctl -p &&
exec my-main-application" exec my-main-application"
extra_hosts:
- "tdnode2:172.27.0.8"
- "tdnode3:172.27.0.9"
- "tdnode4:172.27.0.10"
- "tdnode5:172.27.0.11"
volumes: volumes:
# bind data directory # bind data directory
- type: bind - type: bind
...@@ -32,9 +40,14 @@ services: ...@@ -32,9 +40,14 @@ services:
- type: bind - type: bind
source: /data/node5/cfg source: /data/node5/cfg
target: /etc/taos target: /etc/taos
# bind core dump path
- type: bind
source: /data/node5/core
target: /coredump
- type: bind - type: bind
source: /data source: /data
target: /root target: /root
hostname: tdnode5
networks: networks:
taos_update_net: taos_update_net:
ipv4_address: 172.27.0.11 ipv4_address: 172.27.0.11
......
###################################################################
# Copyright (c) 2016 by TAOS Technologies, Inc.
# All rights reserved.
#
# This file is proprietary and confidential to TAOS Technologies.
# No part of this file may be reproduced, stored, transmitted,
# disclosed or used in any form or by any means other than as
# expressly provided by the written permission from Jianhui Tao
#
###################################################################
# -*- coding: utf-8 -*-
import os
import random
import argparse
class taosdemoxWrapper:
def __init__(self, host, metadata, database, tables, threads, configDir, replica,
columnType, columnsPerTable, rowsPerTable, disorderRatio, disorderRange, charTypeLen):
self.host = host
self.metadata = metadata
self.database = database
self.tables = tables
self.threads = threads
self.configDir = configDir
self.replica = replica
self.columnType = columnType
self.columnsPerTable = columnsPerTable
self.rowsPerTable = rowsPerTable
self.disorderRatio = disorderRatio
self.disorderRange = disorderRange
self.charTypeLen = charTypeLen
def run(self):
if self.metadata is None:
os.system("taosdemox -h %s -d %s -t %d -T %d -c %s -a %d -b %s -n %d -t %d -O %d -R %d -w %d -x -y"
% (self.host, self.database, self.tables, self.threads, self.configDir, self.replica, self.columnType,
self.rowsPerTable, self.disorderRatio, self.disorderRange, self.charTypeLen))
else:
os.system("taosdemox -f %s" % self.metadata)
parser = argparse.ArgumentParser()
parser.add_argument(
'-H',
'--host-name',
action='store',
default='tdnode1',
type=str,
help='host name to be connected (default: tdnode1)')
parser.add_argument(
'-f',
'--metadata',
action='store',
default=None,
type=str,
help='The meta data to execution procedure, if use -f, all other options invalid, Default is NULL')
parser.add_argument(
'-d',
'--db-name',
action='store',
default='test',
type=str,
help='Database name to be created (default: test)')
parser.add_argument(
'-t',
'--num-of-tables',
action='store',
default=10,
type=int,
help='Number of tables (default: 10000)')
parser.add_argument(
'-T',
'--num-of-threads',
action='store',
default=10,
type=int,
help='Number of rest threads (default: 10)')
parser.add_argument(
'-c',
'--config-dir',
action='store',
default='/etc/taos/',
type=str,
help='Configuration directory. (Default is /etc/taos/)')
parser.add_argument(
'-a',
'--replica',
action='store',
default=100,
type=int,
help='Set the replica parameters of the database (default: 1, min: 1, max: 3)')
parser.add_argument(
'-b',
'--column-type',
action='store',
default='int',
type=str,
help='the data_type of columns (default: TINYINT,SMALLINT,INT,BIGINT,FLOAT,DOUBLE,BINARY,NCHAR,BOOL,TIMESTAMP)')
parser.add_argument(
'-l',
'--num-of-cols',
action='store',
default=10,
type=int,
help='The number of columns per record (default: 10)')
parser.add_argument(
'-n',
'--num-of-rows',
action='store',
default=1000,
type=int,
help='Number of subtales per stable (default: 1000)')
parser.add_argument(
'-O',
'--disorder-ratio',
action='store',
default=0,
type=int,
help=' (0: in order, > 0: disorder ratio, default: 0)')
parser.add_argument(
'-R',
'--disorder-range',
action='store',
default=0,
type=int,
help='Out of order datas range, ms (default: 1000)')
parser.add_argument(
'-w',
'--char-type-length',
action='store',
default=16,
type=int,
help='Out of order datas range, ms (default: 16)')
args = parser.parse_args()
taosdemox = taosdemoxWrapper(args.host_name, args.metadata, args.db_name, args.num_of_tables,
args.num_of_threads, args.config_dir, args.replica, args.column_type, args.num_of_cols,
args.num_of_rows, args.disorder_ratio, args.disorder_range, args.char_type_length)
taosdemox.run()
\ No newline at end of file
...@@ -354,10 +354,11 @@ class ThreadCoordinator: ...@@ -354,10 +354,11 @@ class ThreadCoordinator:
# end, and maybe signal them to stop # end, and maybe signal them to stop
if isinstance(err, CrashGenError): # our own transition failure if isinstance(err, CrashGenError): # our own transition failure
Logging.info("State transition error") Logging.info("State transition error")
# TODO: saw an error here once, let's print out stack info for err?
traceback.print_stack() traceback.print_stack()
transitionFailed = True transitionFailed = True
self._te = None # Not running any more self._te = None # Not running any more
self._execStats.registerFailure("State transition error") self._execStats.registerFailure("State transition error: {}".format(err))
else: else:
raise raise
# return transitionFailed # Why did we have this??!! # return transitionFailed # Why did we have this??!!
...@@ -882,8 +883,12 @@ class StateMechine: ...@@ -882,8 +883,12 @@ class StateMechine:
self._stateWeights = [1, 2, 10, 40] self._stateWeights = [1, 2, 10, 40]
def init(self, dbc: DbConn): # late initailization, don't save the dbConn def init(self, dbc: DbConn): # late initailization, don't save the dbConn
self._curState = self._findCurrentState(dbc) # starting state try:
Logging.debug("Found Starting State: {}".format(self._curState)) self._curState = self._findCurrentState(dbc) # starting state
except taos.error.ProgrammingError as err:
Logging.error("Failed to initialized state machine, cannot find current state: {}".format(err))
traceback.print_stack()
raise # re-throw
# TODO: seems no lnoger used, remove? # TODO: seems no lnoger used, remove?
def getCurrentState(self): def getCurrentState(self):
...@@ -951,6 +956,8 @@ class StateMechine: ...@@ -951,6 +956,8 @@ class StateMechine:
# We transition the system to a new state by examining the current state itself # We transition the system to a new state by examining the current state itself
def transition(self, tasks, dbc: DbConn): def transition(self, tasks, dbc: DbConn):
global gSvcMgr
if (len(tasks) == 0): # before 1st step, or otherwise empty if (len(tasks) == 0): # before 1st step, or otherwise empty
Logging.debug("[STT] Starting State: {}".format(self._curState)) Logging.debug("[STT] Starting State: {}".format(self._curState))
return # do nothing return # do nothing
...@@ -2370,7 +2377,7 @@ class MainExec: ...@@ -2370,7 +2377,7 @@ class MainExec:
'-n', '-n',
'--dynamic-db-table-names', '--dynamic-db-table-names',
action='store_true', action='store_true',
help='Use non-fixed names for dbs/tables, useful for multi-instance executions (default: false)') help='Use non-fixed names for dbs/tables, for -b, useful for multi-instance executions (default: false)')
parser.add_argument( parser.add_argument(
'-o', '-o',
'--num-dnodes', '--num-dnodes',
......
...@@ -15,6 +15,7 @@ from util.log import * ...@@ -15,6 +15,7 @@ from util.log import *
from .misc import Logging, CrashGenError, Helper, Dice from .misc import Logging, CrashGenError, Helper, Dice
import os import os
import datetime import datetime
import traceback
# from .service_manager import TdeInstance # from .service_manager import TdeInstance
class DbConn: class DbConn:
...@@ -349,6 +350,7 @@ class DbConnNative(DbConn): ...@@ -349,6 +350,7 @@ class DbConnNative(DbConn):
def execute(self, sql): def execute(self, sql):
if (not self.isOpen): if (not self.isOpen):
traceback.print_stack()
raise CrashGenError( raise CrashGenError(
"Cannot exec SQL unless db connection is open", CrashGenError.DB_CONNECTION_NOT_OPEN) "Cannot exec SQL unless db connection is open", CrashGenError.DB_CONNECTION_NOT_OPEN)
Logging.debug("[SQL] Executing SQL: {}".format(sql)) Logging.debug("[SQL] Executing SQL: {}".format(sql))
...@@ -361,6 +363,7 @@ class DbConnNative(DbConn): ...@@ -361,6 +363,7 @@ class DbConnNative(DbConn):
def query(self, sql): # return rows affected def query(self, sql): # return rows affected
if (not self.isOpen): if (not self.isOpen):
traceback.print_stack()
raise CrashGenError( raise CrashGenError(
"Cannot query database until connection is open, restarting?", CrashGenError.DB_CONNECTION_NOT_OPEN) "Cannot query database until connection is open, restarting?", CrashGenError.DB_CONNECTION_NOT_OPEN)
Logging.debug("[SQL] Executing SQL: {}".format(sql)) Logging.debug("[SQL] Executing SQL: {}".format(sql))
......
...@@ -66,7 +66,7 @@ python3 ./test.py -f tag_lite/int.py ...@@ -66,7 +66,7 @@ python3 ./test.py -f tag_lite/int.py
python3 ./test.py -f tag_lite/set.py python3 ./test.py -f tag_lite/set.py
python3 ./test.py -f tag_lite/smallint.py python3 ./test.py -f tag_lite/smallint.py
python3 ./test.py -f tag_lite/tinyint.py python3 ./test.py -f tag_lite/tinyint.py
python3 ./test.py -f tag_lite/alter_tag.py
#python3 ./test.py -f dbmgmt/database-name-boundary.py #python3 ./test.py -f dbmgmt/database-name-boundary.py
python3 ./test.py -f import_merge/importBlock1HO.py python3 ./test.py -f import_merge/importBlock1HO.py
......
###################################################################
# Copyright (c) 2016 by TAOS Technologies, Inc.
# All rights reserved.
#
# This file is proprietary and confidential to TAOS Technologies.
# No part of this file may be reproduced, stored, transmitted,
# disclosed or used in any form or by any means other than as
# expressly provided by the written permission from Jianhui Tao
#
###################################################################
# -*- coding: utf-8 -*-
import sys
from util.log import *
from util.cases import *
from util.sql import *
class TDTestCase:
def init(self, conn, logSql):
tdLog.debug("start to execute %s" % __file__)
tdSql.init(conn.cursor(), logSql)
def run(self):
tdSql.prepare()
ret = tdSql.execute(
'create table tb (ts timestamp, speed int unsigned)')
insertRows = 10
tdLog.info("insert %d rows" % (insertRows))
for i in range(0, insertRows):
ret = tdSql.execute(
'insert into tb values (now + %dm, %d)' %
(i, i))
tdLog.info("insert earlier data")
tdSql.execute('insert into tb values (now - 5m , 10)')
tdSql.execute('insert into tb values (now - 6m , 10)')
tdSql.execute('insert into tb values (now - 7m , 10)')
tdSql.execute('insert into tb values (now - 8m , 4294967294)')
tdSql.error('insert into tb values (now - 9m, -1)')
tdSql.error('insert into tb values (now - 9m, 4294967295)')
tdSql.query("select * from tb")
tdSql.checkRows(insertRows + 4)
def stop(self):
tdSql.close()
tdLog.success("%s successfully executed" % __file__)
tdCases.addWindows(__file__, TDTestCase())
tdCases.addLinux(__file__, TDTestCase())
...@@ -16,10 +16,10 @@ python3 ./test.py -f insert/nchar.py ...@@ -16,10 +16,10 @@ python3 ./test.py -f insert/nchar.py
python3 ./test.py -f insert/nchar-unicode.py python3 ./test.py -f insert/nchar-unicode.py
python3 ./test.py -f insert/multi.py python3 ./test.py -f insert/multi.py
python3 ./test.py -f insert/randomNullCommit.py python3 ./test.py -f insert/randomNullCommit.py
#python3 insert/retentionpolicy.py python3 insert/retentionpolicy.py
python3 ./test.py -f insert/alterTableAndInsert.py python3 ./test.py -f insert/alterTableAndInsert.py
python3 ./test.py -f insert/insertIntoTwoTables.py python3 ./test.py -f insert/insertIntoTwoTables.py
#python3 ./test.py -f insert/before_1970.py python3 ./test.py -f insert/before_1970.py
python3 bug2265.py python3 bug2265.py
#table #table
......
...@@ -23,4 +23,11 @@ python3 ./test.py -f functions/function_sum.py -r 1 ...@@ -23,4 +23,11 @@ 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_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 ./test.py -f functions/function_twa_test2.py
python3 ./test.py -f functions/function_stddev_td2555.pyhao python3 ./test.py -f functions/function_stddev_td2555.py
\ No newline at end of file python3 ./test.py -f insert/metadataUpdate.py
python3 ./test.py -f tools/taosdemoTest2.py
python3 ./test.py -f query/last_cache.py
python3 ./test.py -f query/last_row_cache.py
python3 ./test.py -f account/account_create.py
python3 ./test.py -f alter/alter_table.py
python3 ./test.py -f query/queryGroupbySort.py
\ No newline at end of file
###################################################################
# Copyright (c) 2016 by TAOS Technologies, Inc.
# All rights reserved.
#
# This file is proprietary and confidential to TAOS Technologies.
# No part of this file may be reproduced, stored, transmitted,
# disclosed or used in any form or by any means other than as
# expressly provided by the written permission from Jianhui Tao
#
###################################################################
# -*- coding: utf-8 -*-
import sys
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):
tdLog.debug("start to execute %s" % __file__)
tdSql.init(conn.cursor(), logSql)
self.ts = 1538548685000
def run(self):
tdSql.prepare()
print("==============step1")
tdSql.execute(
"CREATE TABLE IF NOT EXISTS ampere (ts TIMESTAMP(8),ampere DOUBLE(8)) TAGS (device_name BINARY(50),build_id BINARY(50),project_id BINARY(50),alias BINARY(50))")
tdSql.execute("insert into d1001 using ampere tags('test', '2', '2', '2') VALUES (now, 123)")
tdSql.execute("ALTER TABLE ampere ADD TAG variable_id BINARY(50)")
print("==============step2")
tdSql.execute("insert into d1002 using ampere tags('test', '2', '2', '2', 'test') VALUES (now, 124)")
tdSql.query("select * from ampere")
tdSql.checkRows(2)
tdSql.checkData(0, 6, None)
tdSql.checkData(1, 6, 'test')
def stop(self):
tdSql.close()
tdLog.success("%s successfully executed" % __file__)
tdCases.addWindows(__file__, TDTestCase())
tdCases.addLinux(__file__, TDTestCase())
system sh/stop_dnodes.sh
system sh/deploy.sh -n dnode1 -i 1
system sh/cfg.sh -n dnode1 -c walLevel -v 0
system sh/cfg.sh -n dnode1 -c maxtablesPerVnode -v 2
system sh/exec.sh -n dnode1 -s start
sleep 100
sql connect
print ======================== dnode1 start
$db = testdb
sql create database $db
sql use $db
sql create stable st2 (ts timestamp, f1 int) tags (id int, t1 int, t2 nchar(4), t3 double)
sql insert into tb1 using st2 (id, t1) tags(1,2) values (now, 1)
sql select id,t1,t2,t3 from tb1
if $rows != 1 then
return -1
endi
if $data00 != 1 then
return -1
endi
if $data01 != 2 then
return -1
endi
if $data02 != NULL then
return -1
endi
if $data03 != NULL then
return -1
endi
sql create table tb2 using st2 (t2,t3) tags ("12",22.0)
sql select id,t1,t2,t3 from tb2;
if $rows != 1 then
return -1
endi
if $data00 != NULL then
return -1
endi
if $data01 != NULL then
return -1
endi
if $data02 != 12 then
return -1
endi
if $data03 != 22.000000000 then
return -1
endi
sql create table tb3 using st2 tags (1,2,"3",33.0);
sql select id,t1,t2,t3 from tb3;
if $rows != 1 then
return -1
endi
if $data00 != 1 then
return -1
endi
if $data01 != 2 then
return -1
endi
if $data02 != 3 then
return -1
endi
if $data03 != 33.000000000 then
return -1
endi
sql insert into tb4 using st2 tags(1,2,"33",44.0) values (now, 1);
sql select id,t1,t2,t3 from tb4;
if $rows != 1 then
return -1
endi
if $data00 != 1 then
return -1
endi
if $data01 != 2 then
return -1
endi
if $data02 != 33 then
return -1
endi
if $data03 != 44.000000000 then
return -1
endi
sql_error create table tb5 using st2() tags (3,3,"3",33.0);
sql_error create table tb6 using st2 (id,t1) tags (3,3,"3",33.0);
sql_error create table tb7 using st2 (id,t1) tags (3);
sql_error create table tb8 using st2 (ide) tags (3);
sql_error create table tb9 using st2 (id);
sql_error create table tb10 using st2 (id t1) tags (1,1);
sql_error create table tb10 using st2 (id,,t1) tags (1,1,1);
sql_error create table tb11 using st2 (id,t1,) tags (1,1,1);
sql create table tb12 using st2 (t1,id) tags (2,1);
sql select id,t1,t2,t3 from tb12;
if $rows != 1 then
return -1
endi
if $data00 != 1 then
return -1
endi
if $data01 != 2 then
return -1
endi
if $data02 != NULL then
return -1
endi
if $data03 != NULL then
return -1
endi
sql create table tb13 using st2 ("t1",'id') tags (2,1);
sql select id,t1,t2,t3 from tb13;
if $rows != 1 then
return -1
endi
if $data00 != 1 then
return -1
endi
if $data01 != 2 then
return -1
endi
if $data02 != NULL then
return -1
endi
if $data03 != NULL then
return -1
endi
system sh/exec.sh -n dnode1 -s stop -x SIGINT
...@@ -72,4 +72,3 @@ cd ../../../debug; make ...@@ -72,4 +72,3 @@ cd ../../../debug; make
./test.sh -f unique/cluster/cache.sim ./test.sh -f unique/cluster/cache.sim
./test.sh -f unique/cluster/vgroup100.sim ./test.sh -f unique/cluster/vgroup100.sim
./test.sh -f unique/column/replica3.sim
\ No newline at end of file
...@@ -35,4 +35,12 @@ ...@@ -35,4 +35,12 @@
./test.sh -f general/stable/refcount.sim ./test.sh -f general/stable/refcount.sim
./test.sh -f general/stable/show.sim ./test.sh -f general/stable/show.sim
./test.sh -f general/stable/values.sim ./test.sh -f general/stable/values.sim
./test.sh -f general/stable/vnode3.sim ./test.sh -f general/stable/vnode3.sim
\ No newline at end of file
./test.sh -f unique/column/replica3.sim
./test.sh -f issue/TD-2713.sim
./test.sh -f general/parser/select_distinct_tag.sim
./test.sh -f unique/mnode/mgmt30.sim
./test.sh -f issue/TD-2677.sim
./test.sh -f issue/TD-2680.sim
./test.sh -f unique/dnode/lossdata.sim
\ No newline at end of file
...@@ -81,7 +81,9 @@ char *simParseHostName(char *varName) { ...@@ -81,7 +81,9 @@ char *simParseHostName(char *varName) {
} }
bool simSystemInit() { bool simSystemInit() {
taos_init(); if (taos_init()) {
return false;
}
taosGetFqdn(simHostName); taosGetFqdn(simHostName);
simInitsimCmdList(); simInitsimCmdList();
memset(simScriptList, 0, sizeof(SScript *) * MAX_MAIN_SCRIPT_NUM); memset(simScriptList, 0, sizeof(SScript *) * MAX_MAIN_SCRIPT_NUM);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册