未验证 提交 608be1e9 编写于 作者: S shenglian-zhou 提交者: GitHub

Merge branch 'develop' into szhou/feature/support-math-functions

...@@ -413,7 +413,7 @@ pipeline { ...@@ -413,7 +413,7 @@ pipeline {
stage('test_b4_s7') { stage('test_b4_s7') {
agent{label " slave7 || slave17 "} agent{label " slave7 || slave17 "}
steps { steps {
timeout(time: 55, unit: 'MINUTES'){ timeout(time: 105, unit: 'MINUTES'){
pre_test() pre_test()
sh ''' sh '''
date date
......
...@@ -573,6 +573,14 @@ cd C:\TDengine\connector\python ...@@ -573,6 +573,14 @@ cd C:\TDengine\connector\python
python -m pip install . python -m pip install .
``` ```
**PyPI**
从2.1.1版本开始,用户可以从[PyPI](https://pypi.org/project/taospy/)安装:
```sh
pip install taospy
```
* 如果机器上没有pip命令,用户可将src/connector/python下的taos文件夹拷贝到应用程序的目录使用。 * 如果机器上没有pip命令,用户可将src/connector/python下的taos文件夹拷贝到应用程序的目录使用。
对于windows 客户端,安装TDengine windows 客户端后,将C:\TDengine\driver\taos.dll拷贝到C:\windows\system32目录下即可。 对于windows 客户端,安装TDengine windows 客户端后,将C:\TDengine\driver\taos.dll拷贝到C:\windows\system32目录下即可。
...@@ -608,6 +616,22 @@ python3 PythonChecker.py -host <fqdn> ...@@ -608,6 +616,22 @@ python3 PythonChecker.py -host <fqdn>
### Python连接器的使用 ### Python连接器的使用
#### PEP-249 兼容API
您可以像其他数据库一样,使用类似 [PEP-249](https://www.python.org/dev/peps/pep-0249/) 数据库API规范风格的API:
```python
import taos
conn = taos.connect()
cursor = conn.cursor()
cursor.execute("show databases")
results = cursor.fetchall()
for row in results:
print(row)
```
#### 代码示例 #### 代码示例
* 导入TDengine客户端模块 * 导入TDengine客户端模块
...@@ -663,6 +687,44 @@ for data in c1: ...@@ -663,6 +687,44 @@ for data in c1:
print("ts=%s, temperature=%d, humidity=%f" %(data[0], data[1],data[2])) print("ts=%s, temperature=%d, humidity=%f" %(data[0], data[1],data[2]))
``` ```
* 从v2.1.0版本开始, 我们提供另外一种API:`connection.query`
```python
import taos
conn = taos.connect()
conn.execute("create database if not exists pytest")
result = conn.query("show databases")
num_of_fields = result.field_count
for field in result.fields:
print(field)
for row in result:
print(row)
conn.execute("drop database pytest")
```
`query` 方法会返回一个 `TaosResult` 类对象,并提供了以下有用的属性或方法:
属性:
- `fields`: `TaosFields` 集合类,提供返回数据的列信息。
- `field_count`: 返回数据的列数.
- `affected_rows`: 插入数据的行数.
- `row_count`: 查询数据结果数.
- `precision`: 当前数据库的时间精度.
方法:
- `fetch_all()`: 类似于 `cursor.fetchall()` 返回同样的集合数据
- `fetch_all_into_dict()`: v2.1.1 新添加的API,将上面的数据转换成字典类型返回
- `blocks_iter()` `rows_iter()`: 根据底层API提供的两种不同迭代器。
- `fetch_rows_a`: 异步API
- `errno`: 错误码
- `errstr`: 错误信息
- `close`: 关闭结果对象,一般不需要直接调用
* 创建订阅 * 创建订阅
```python ```python
......
...@@ -1579,11 +1579,11 @@ SELECT function_list FROM stb_name ...@@ -1579,11 +1579,11 @@ SELECT function_list FROM stb_name
CREATE TABLE meters (ts TIMESTAMP, current FLOAT, voltage INT, phase FLOAT) TAGS (location BINARY(64), groupId INT); CREATE TABLE meters (ts TIMESTAMP, current FLOAT, voltage INT, phase FLOAT) TAGS (location BINARY(64), groupId INT);
``` ```
针对智能电表采集的数据,以 10 分钟为一个阶段,计算过去 24 小时的电流数据的平均值、最大值、电流的中位数、以及随着时间变化的电流走势拟合直线。如果没有计算值,用前一个非 NULL 值填充。使用的查询语句如下: 针对智能电表采集的数据,以 10 分钟为一个阶段,计算过去 24 小时的电流数据的平均值、最大值、电流的中位数。如果没有计算值,用前一个非 NULL 值填充。使用的查询语句如下:
```mysql ```mysql
SELECT AVG(current), MAX(current), LEASTSQUARES(current, start_val, step_val), PERCENTILE(current, 50) FROM meters SELECT AVG(current), MAX(current), APERCENTILE(current, 50) FROM meters
WHERE ts>=NOW-1d WHERE ts>=NOW-1d and ts<=now
INTERVAL(10m) INTERVAL(10m)
FILL(PREV); FILL(PREV);
``` ```
......
...@@ -419,19 +419,47 @@ or ...@@ -419,19 +419,47 @@ or
`pip3 install src/connector/python/` `pip3 install src/connector/python/`
You can install the `taospy` connector from [PyPI](https://pypi.org/project/taospy/):
```sh
pip install taospy
```
#### Windows #### Windows
With Windows TDengine client installed, copy the file "C:\TDengine\driver\taos.dll" to the "C:\ windows\ system32" directory and enter the Windows <em>cmd</em> command line interface: With Windows TDengine client installed, copy the file "C:\TDengine\driver\taos.dll" to the "C:\Windows\system32" directory and enter the Windows *cmd* command line interface:
```cmd ```cmd
cd C:\TDengine\connector\python cd C:\TDengine\connector\python
python -m pip install . python -m pip install .
``` ```
Or install from PyPI:
```cmd
pip install taospy
```
- If there is no `pip` command on the machine, the user can copy the taos folder under src/connector/python to the application directory for use. For Windows client, after installing the TDengine Windows client, copy C:\ TDengine\driver\taos.dll to the C:\ windows\ system32 directory. - If there is no `pip` command on the machine, the user can copy the taos folder under src/connector/python to the application directory for use. For Windows client, after installing the TDengine Windows client, copy C:\ TDengine\driver\taos.dll to the C:\ windows\ system32 directory.
### How to use ### How to use
#### PEP-249 Python Database API
Definitely you can use the [PEP-249](https://www.python.org/dev/peps/pep-0249/) database API like other type of databases:
```python
import taos
conn = taos.connect()
cursor = conn.cursor()
cursor.execute("show databases")
results = cursor.fetchall()
for row in results:
print(row)
```
#### Code sample #### Code sample
- Import the TDengine client module - Import the TDengine client module
...@@ -488,6 +516,44 @@ for data in c1: ...@@ -488,6 +516,44 @@ for data in c1:
print("ts=%s, temperature=%d, humidity=%f" %(data[0], data[1],data[2])) print("ts=%s, temperature=%d, humidity=%f" %(data[0], data[1],data[2]))
``` ```
- Since v2.1.0, python connector provides a new API for query:
```python
import taos
conn = taos.connect()
conn.execute("create database if not exists pytest")
result = conn.query("show databases")
num_of_fields = result.field_count
for field in result.fields:
print(field)
for row in result:
print(row)
conn.execute("drop database pytest")
```
The `query` method returns `TaosResult` class. It provides high level APIs for convenient use:
Properties:
- `fields`: the `TaosFields` object contains the column metadata, given the collection of each column field metadata by iterator.
- `field_count`: column number of result.
- `affected_rows`: the rows completed for insert.
- `row_count`: the rows number for select.
- `precision`: the result precision.
Functions:
- `fetch_all()`: get all data as tuple array.
- `fetch_all_into_dict()`: get all data as dict array, added since v2.1.1
- `blocks_iter()`: provides iterator by C `taos_fetch_blocks` API
- `rows_iter()`: provides iterator by C `taos_fetch_row` API
- `fetch_rows_a`: fetch rows by async API in taosc.
- `errno`: error code if failed.
- `errstr`: error string if failed.
- `close`: close result, you do not need to call it directly, result will auto closed out of scope.
- Create subscription - Create subscription
```python ```python
...@@ -510,6 +576,7 @@ for d in data: ...@@ -510,6 +576,7 @@ for d in data:
sub.close() sub.close()
``` ```
- Close connection - Close connection
```python ```python
......
...@@ -213,7 +213,7 @@ else ...@@ -213,7 +213,7 @@ else
exit 1 exit 1
fi fi
make -j8 make
cd ${curr_dir} cd ${curr_dir}
......
name: tdengine name: tdengine
base: core18 base: core20
version: '2.3.0.0' version: '2.3.0.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.
...@@ -39,14 +39,17 @@ parts: ...@@ -39,14 +39,17 @@ parts:
- taoswrapper.sh - taoswrapper.sh
tdengine: tdengine:
plugin: cmake
source: . source: .
source-type: local source-type: local
plugin: cmake
build-packages: build-packages:
- gcc - gcc
- g++ - g++
- make - make
- cmake - cmake
cmake-parameters:
- -DCMAKE_BUILD_TYPE=Release
- -DBUILD_HTTP=true
override-build: | override-build: |
snapcraftctl build snapcraftctl build
if [ ! -d $SNAPCRAFT_STAGE/usr ]; then if [ ! -d $SNAPCRAFT_STAGE/usr ]; then
......
...@@ -67,6 +67,7 @@ typedef struct { ...@@ -67,6 +67,7 @@ typedef struct {
int64_t affectedRows; int64_t affectedRows;
} SSmlLinesInfo; } SSmlLinesInfo;
void addEscapeCharToString(char *str, int32_t len);
int tscSmlInsert(TAOS* taos, TAOS_SML_DATA_POINT* points, int numPoint, SSmlLinesInfo* info); int tscSmlInsert(TAOS* taos, TAOS_SML_DATA_POINT* points, int numPoint, SSmlLinesInfo* info);
bool checkDuplicateKey(char *key, SHashObj *pHash, SSmlLinesInfo* info); bool checkDuplicateKey(char *key, SHashObj *pHash, SSmlLinesInfo* info);
bool isValidInteger(char *str); bool isValidInteger(char *str);
......
...@@ -251,6 +251,7 @@ void tscColumnListCopyAll(SArray* dst, const SArray* src); ...@@ -251,6 +251,7 @@ void tscColumnListCopyAll(SArray* dst, const SArray* src);
void convertQueryResult(SSqlRes* pRes, SQueryInfo* pQueryInfo, uint64_t objId, bool convertNchar); void convertQueryResult(SSqlRes* pRes, SQueryInfo* pQueryInfo, uint64_t objId, bool convertNchar);
void tscDequoteAndTrimToken(SStrToken* pToken); void tscDequoteAndTrimToken(SStrToken* pToken);
void tscRmEscapeAndTrimToken(SStrToken* pToken);
int32_t tscValidateName(SStrToken* pToken, bool escapeEnabled, bool *dbIncluded); int32_t tscValidateName(SStrToken* pToken, bool escapeEnabled, bool *dbIncluded);
void tscIncStreamExecutionCount(void* pStream); void tscIncStreamExecutionCount(void* pStream);
......
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_alibaba_datax_plugin_writer_JniConnection */
#ifndef _Included_com_alibaba_datax_plugin_writer_JniConnection
#define _Included_com_alibaba_datax_plugin_writer_JniConnection
#ifdef __cplusplus
extern "C" {
#endif
#undef com_alibaba_datax_plugin_writer_JniConnection_JNI_NULL_POINTER
#define com_alibaba_datax_plugin_writer_JniConnection_JNI_NULL_POINTER 0LL
#undef com_alibaba_datax_plugin_writer_JniConnection_JNI_SUCCESSFUL
#define com_alibaba_datax_plugin_writer_JniConnection_JNI_SUCCESSFUL 0L
/*
* Class: com_alibaba_datax_plugin_writer_JniConnection
* Method: initImp
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_com_alibaba_datax_plugin_writer_JniConnection_initImp
(JNIEnv *, jclass, jstring);
/*
* Class: com_alibaba_datax_plugin_writer_JniConnection
* Method: setOptions
* Signature: (ILjava/lang/String;)I
*/
JNIEXPORT jint JNICALL Java_com_alibaba_datax_plugin_writer_JniConnection_setOptions
(JNIEnv *, jclass, jint, jstring);
/*
* Class: com_alibaba_datax_plugin_writer_JniConnection
* Method: connectImp
* Signature: (Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)J
*/
JNIEXPORT jlong JNICALL Java_com_alibaba_datax_plugin_writer_JniConnection_connectImp
(JNIEnv *, jobject, jstring, jint, jstring, jstring, jstring);
/*
* Class: com_alibaba_datax_plugin_writer_JniConnection
* Method: getErrCodeImp
* Signature: (JJ)I
*/
JNIEXPORT jint JNICALL Java_com_alibaba_datax_plugin_writer_JniConnection_getErrCodeImp
(JNIEnv *, jobject, jlong, jlong);
/*
* Class: com_alibaba_datax_plugin_writer_JniConnection
* Method: getErrMsgImp
* Signature: (J)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_alibaba_datax_plugin_writer_JniConnection_getErrMsgImp
(JNIEnv *, jobject, jlong);
/*
* Class: com_alibaba_datax_plugin_writer_JniConnection
* Method: freeResultSetImp
* Signature: (JJ)V
*/
JNIEXPORT void JNICALL Java_com_alibaba_datax_plugin_writer_JniConnection_freeResultSetImp
(JNIEnv *, jobject, jlong, jlong);
/*
* Class: com_alibaba_datax_plugin_writer_JniConnection
* Method: closeConnectionImp
* Signature: (J)I
*/
JNIEXPORT jint JNICALL Java_com_alibaba_datax_plugin_writer_JniConnection_closeConnectionImp
(JNIEnv *, jobject, jlong);
/*
* Class: com_alibaba_datax_plugin_writer_JniConnection
* Method: insertOpentsdbJson
* Signature: (Ljava/lang/String;J)J
*/
JNIEXPORT jlong JNICALL Java_com_alibaba_datax_plugin_writer_JniConnection_insertOpentsdbJson
(JNIEnv *, jobject, jstring, jlong);
#ifdef __cplusplus
}
#endif
#endif
#include <jni.h>
#ifndef TDENGINE_JNICOMMON_H
#define TDENGINE_JNICOMMON_H
#define jniFatal(...) \
{ \
if (jniDebugFlag & DEBUG_FATAL) { \
taosPrintLog("JNI FATAL ", tscEmbedded ? 255 : jniDebugFlag, __VA_ARGS__); \
} \
}
#define jniError(...) \
{ \
if (jniDebugFlag & DEBUG_ERROR) { \
taosPrintLog("JNI ERROR ", tscEmbedded ? 255 : jniDebugFlag, __VA_ARGS__); \
} \
}
#define jniWarn(...) \
{ \
if (jniDebugFlag & DEBUG_WARN) { \
taosPrintLog("JNI WARN ", tscEmbedded ? 255 : jniDebugFlag, __VA_ARGS__); \
} \
}
#define jniInfo(...) \
{ \
if (jniDebugFlag & DEBUG_INFO) { \
taosPrintLog("JNI ", tscEmbedded ? 255 : jniDebugFlag, __VA_ARGS__); \
} \
}
#define jniDebug(...) \
{ \
if (jniDebugFlag & DEBUG_DEBUG) { \
taosPrintLog("JNI ", jniDebugFlag, __VA_ARGS__); \
} \
}
#define jniTrace(...) \
{ \
if (jniDebugFlag & DEBUG_TRACE) { \
taosPrintLog("JNI ", jniDebugFlag, __VA_ARGS__); \
} \
}
extern jclass g_arrayListClass;
extern jmethodID g_arrayListConstructFp;
extern jmethodID g_arrayListAddFp;
extern jclass g_metadataClass;
extern jmethodID g_metadataConstructFp;
extern jfieldID g_metadataColtypeField;
extern jfieldID g_metadataColnameField;
extern jfieldID g_metadataColsizeField;
extern jfieldID g_metadataColindexField;
extern jclass g_rowdataClass;
extern jmethodID g_rowdataConstructor;
extern jmethodID g_rowdataClearFp;
extern jmethodID g_rowdataSetBooleanFp;
extern jmethodID g_rowdataSetByteFp;
extern jmethodID g_rowdataSetShortFp;
extern jmethodID g_rowdataSetIntFp;
extern jmethodID g_rowdataSetLongFp;
extern jmethodID g_rowdataSetFloatFp;
extern jmethodID g_rowdataSetDoubleFp;
extern jmethodID g_rowdataSetStringFp;
extern jmethodID g_rowdataSetTimestampFp;
extern jmethodID g_rowdataSetByteArrayFp;
extern jmethodID g_blockdataSetByteArrayFp;
extern jmethodID g_blockdataSetNumOfRowsFp;
extern jmethodID g_blockdataSetNumOfColsFp;
#define JNI_SUCCESS 0
#define JNI_TDENGINE_ERROR -1
#define JNI_CONNECTION_NULL -2
#define JNI_RESULT_SET_NULL -3
#define JNI_NUM_OF_FIELDS_0 -4
#define JNI_SQL_NULL -5
#define JNI_FETCH_END -6
#define JNI_OUT_OF_MEMORY -7
extern JavaVM *g_vm;
void jniGetGlobalMethod(JNIEnv *env);
int32_t check_for_params(jobject jobj, jlong conn, jlong res);
#endif // TDENGINE_JNICOMMON_H
...@@ -17,46 +17,9 @@ ...@@ -17,46 +17,9 @@
#include "taos.h" #include "taos.h"
#include "tlog.h" #include "tlog.h"
#include "tscUtil.h" #include "tscUtil.h"
#include "tscParseLine.h"
#include "com_taosdata_jdbc_TSDBJNIConnector.h" #include "com_taosdata_jdbc_TSDBJNIConnector.h"
#include "jniCommon.h"
#define jniFatal(...) \
{ \
if (jniDebugFlag & DEBUG_FATAL) { \
taosPrintLog("JNI FATAL ", tscEmbedded ? 255 : jniDebugFlag, __VA_ARGS__); \
} \
}
#define jniError(...) \
{ \
if (jniDebugFlag & DEBUG_ERROR) { \
taosPrintLog("JNI ERROR ", tscEmbedded ? 255 : jniDebugFlag, __VA_ARGS__); \
} \
}
#define jniWarn(...) \
{ \
if (jniDebugFlag & DEBUG_WARN) { \
taosPrintLog("JNI WARN ", tscEmbedded ? 255 : jniDebugFlag, __VA_ARGS__); \
} \
}
#define jniInfo(...) \
{ \
if (jniDebugFlag & DEBUG_INFO) { \
taosPrintLog("JNI ", tscEmbedded ? 255 : jniDebugFlag, __VA_ARGS__); \
} \
}
#define jniDebug(...) \
{ \
if (jniDebugFlag & DEBUG_DEBUG) { \
taosPrintLog("JNI ", jniDebugFlag, __VA_ARGS__); \
} \
}
#define jniTrace(...) \
{ \
if (jniDebugFlag & DEBUG_TRACE) { \
taosPrintLog("JNI ", jniDebugFlag, __VA_ARGS__); \
} \
}
int __init = 0; int __init = 0;
...@@ -91,16 +54,7 @@ jmethodID g_blockdataSetByteArrayFp; ...@@ -91,16 +54,7 @@ jmethodID g_blockdataSetByteArrayFp;
jmethodID g_blockdataSetNumOfRowsFp; jmethodID g_blockdataSetNumOfRowsFp;
jmethodID g_blockdataSetNumOfColsFp; jmethodID g_blockdataSetNumOfColsFp;
#define JNI_SUCCESS 0 void jniGetGlobalMethod(JNIEnv *env) {
#define JNI_TDENGINE_ERROR -1
#define JNI_CONNECTION_NULL -2
#define JNI_RESULT_SET_NULL -3
#define JNI_NUM_OF_FIELDS_0 -4
#define JNI_SQL_NULL -5
#define JNI_FETCH_END -6
#define JNI_OUT_OF_MEMORY -7
static void jniGetGlobalMethod(JNIEnv *env) {
// make sure init function executed once // make sure init function executed once
switch (atomic_val_compare_exchange_32(&__init, 0, 1)) { switch (atomic_val_compare_exchange_32(&__init, 0, 1)) {
case 0: case 0:
...@@ -159,7 +113,7 @@ static void jniGetGlobalMethod(JNIEnv *env) { ...@@ -159,7 +113,7 @@ static void jniGetGlobalMethod(JNIEnv *env) {
jniDebug("native method register finished"); jniDebug("native method register finished");
} }
static int32_t check_for_params(jobject jobj, jlong conn, jlong res) { int32_t check_for_params(jobject jobj, jlong conn, jlong res) {
if ((TAOS *)conn == NULL) { if ((TAOS *)conn == NULL) {
jniError("jobj:%p, connection is closed", jobj); jniError("jobj:%p, connection is closed", jobj);
return JNI_CONNECTION_NULL; return JNI_CONNECTION_NULL;
...@@ -219,26 +173,8 @@ JNIEXPORT jobject createTSDBException(JNIEnv *env, int code, char *msg) { ...@@ -219,26 +173,8 @@ JNIEXPORT jobject createTSDBException(JNIEnv *env, int code, char *msg) {
return exception_obj; return exception_obj;
} }
/*
* Class: com_taosdata_jdbc_TSDBJNIConnector
* Method: setConfigImp
* Signature: (Ljava/lang/String;)Lcom/taosdata/jdbc/TSDBException;
*/
JNIEXPORT jobject JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_setConfigImp(JNIEnv *env, jclass jobj, JNIEXPORT jobject JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_setConfigImp(JNIEnv *env, jclass jobj,
jstring config) { jstring config) {
/*
if (config == NULL) {
jniDebug("config value is null");
return -1;
}
const char *cfg = (*env)->GetStringUTFChars(env, config, NULL);
if (!cfg) {
return -1;
}
return 0;
*/
if (config == NULL) { if (config == NULL) {
char *msg = "config value is null"; char *msg = "config value is null";
jniDebug("config value is null"); jniDebug("config value is null");
...@@ -254,7 +190,7 @@ JNIEXPORT jobject JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_setConfigImp(J ...@@ -254,7 +190,7 @@ JNIEXPORT jobject JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_setConfigImp(J
setConfRet result = taos_set_config(cfg); setConfRet result = taos_set_config(cfg);
int code = result.retCode; int code = result.retCode;
char * msg = result.retMsg; char *msg = result.retMsg;
return createTSDBException(env, code, msg); return createTSDBException(env, code, msg);
} }
...@@ -424,7 +360,7 @@ JNIEXPORT jstring JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_getErrMsgImp(J ...@@ -424,7 +360,7 @@ JNIEXPORT jstring JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_getErrMsgImp(J
JNIEXPORT jlong JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_getResultSetImp(JNIEnv *env, jobject jobj, jlong con, JNIEXPORT jlong JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_getResultSetImp(JNIEnv *env, jobject jobj, jlong con,
jlong tres) { jlong tres) {
TAOS * tscon = (TAOS *)con; TAOS *tscon = (TAOS *)con;
int32_t code = check_for_params(jobj, con, tres); int32_t code = check_for_params(jobj, con, tres);
if (code != JNI_SUCCESS) { if (code != JNI_SUCCESS) {
return code; return code;
...@@ -467,7 +403,7 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_freeResultSetImp( ...@@ -467,7 +403,7 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_freeResultSetImp(
JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_getAffectedRowsImp(JNIEnv *env, jobject jobj, jlong con, JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_getAffectedRowsImp(JNIEnv *env, jobject jobj, jlong con,
jlong res) { jlong res) {
TAOS * tscon = (TAOS *)con; TAOS *tscon = (TAOS *)con;
int32_t code = check_for_params(jobj, con, res); int32_t code = check_for_params(jobj, con, res);
if (code != JNI_SUCCESS) { if (code != JNI_SUCCESS) {
return code; return code;
...@@ -483,13 +419,13 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_getAffectedRowsIm ...@@ -483,13 +419,13 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_getAffectedRowsIm
JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_getSchemaMetaDataImp(JNIEnv *env, jobject jobj, JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_getSchemaMetaDataImp(JNIEnv *env, jobject jobj,
jlong con, jlong res, jlong con, jlong res,
jobject arrayListObj) { jobject arrayListObj) {
TAOS * tscon = (TAOS *)con; TAOS *tscon = (TAOS *)con;
int32_t code = check_for_params(jobj, con, res); int32_t code = check_for_params(jobj, con, res);
if (code != JNI_SUCCESS) { if (code != JNI_SUCCESS) {
return code; return code;
} }
TAOS_RES * tres = (TAOS_RES *)res; TAOS_RES *tres = (TAOS_RES *)res;
TAOS_FIELD *fields = taos_fetch_fields(tres); TAOS_FIELD *fields = taos_fetch_fields(tres);
int32_t num_fields = taos_num_fields(tres); int32_t num_fields = taos_num_fields(tres);
...@@ -626,13 +562,13 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_fetchRowImp(JNIEn ...@@ -626,13 +562,13 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_fetchRowImp(JNIEn
JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_fetchBlockImp(JNIEnv *env, jobject jobj, jlong con, JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_fetchBlockImp(JNIEnv *env, jobject jobj, jlong con,
jlong res, jobject rowobj) { jlong res, jobject rowobj) {
TAOS * tscon = (TAOS *)con; TAOS *tscon = (TAOS *)con;
int32_t code = check_for_params(jobj, con, res); int32_t code = check_for_params(jobj, con, res);
if (code != JNI_SUCCESS) { if (code != JNI_SUCCESS) {
return code; return code;
} }
TAOS_RES * tres = (TAOS_RES *)res; TAOS_RES *tres = (TAOS_RES *)res;
TAOS_FIELD *fields = taos_fetch_fields(tres); TAOS_FIELD *fields = taos_fetch_fields(tres);
int32_t numOfFields = taos_num_fields(tres); int32_t numOfFields = taos_num_fields(tres);
...@@ -1021,7 +957,7 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_setTableNameTagsI ...@@ -1021,7 +957,7 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_setTableNameTagsI
} }
const char *name = (*env)->GetStringUTFChars(env, tableName, NULL); const char *name = (*env)->GetStringUTFChars(env, tableName, NULL);
char * curTags = tagsData; char *curTags = tagsData;
TAOS_BIND *tagsBind = calloc(numOfTags, sizeof(TAOS_BIND)); TAOS_BIND *tagsBind = calloc(numOfTags, sizeof(TAOS_BIND));
for (int32_t i = 0; i < numOfTags; ++i) { for (int32_t i = 0; i < numOfTags; ++i) {
......
#include "os.h"
#include "taos.h"
#include "tlog.h"
#include "tscUtil.h"
#include "com_alibaba_datax_plugin_writer_JniConnection.h"
#include "jniCommon.h"
jclass g_arrayListClass;
jmethodID g_arrayListConstructFp;
jmethodID g_arrayListAddFp;
jclass g_metadataClass;
jmethodID g_metadataConstructFp;
jfieldID g_metadataColtypeField;
jfieldID g_metadataColnameField;
jfieldID g_metadataColsizeField;
jfieldID g_metadataColindexField;
jclass g_rowdataClass;
jmethodID g_rowdataConstructor;
jmethodID g_rowdataClearFp;
jmethodID g_rowdataSetBooleanFp;
jmethodID g_rowdataSetByteFp;
jmethodID g_rowdataSetShortFp;
jmethodID g_rowdataSetIntFp;
jmethodID g_rowdataSetLongFp;
jmethodID g_rowdataSetFloatFp;
jmethodID g_rowdataSetDoubleFp;
jmethodID g_rowdataSetStringFp;
jmethodID g_rowdataSetTimestampFp;
jmethodID g_rowdataSetByteArrayFp;
jmethodID g_blockdataSetByteArrayFp;
jmethodID g_blockdataSetNumOfRowsFp;
jmethodID g_blockdataSetNumOfColsFp;
JNIEXPORT void JNICALL Java_com_alibaba_datax_plugin_writer_JniConnection_initImp(JNIEnv *env, jobject jobj,
jstring jconfigDir) {
if (jconfigDir != NULL) {
const char *confDir = (*env)->GetStringUTFChars(env, jconfigDir, NULL);
if (confDir && strlen(confDir) != 0) {
tstrncpy(configDir, confDir, TSDB_FILENAME_LEN);
}
(*env)->ReleaseStringUTFChars(env, jconfigDir, confDir);
}
jniDebug("jni initialized successfully, config directory: %s", configDir);
}
JNIEXPORT jint JNICALL Java_com_alibaba_datax_plugin_writer_JniConnection_setOptions(JNIEnv *env, jobject jobj,
jint optionIndex,
jstring optionValue) {
if (optionValue == NULL) {
jniDebug("option index:%d value is null", (int32_t)optionIndex);
return 0;
}
int res = 0;
if (optionIndex == TSDB_OPTION_LOCALE) {
const char *locale = (*env)->GetStringUTFChars(env, optionValue, NULL);
if (locale && strlen(locale) != 0) {
res = taos_options(TSDB_OPTION_LOCALE, locale);
jniDebug("set locale to %s, result:%d", locale, res);
} else {
jniDebug("input locale is empty");
}
(*env)->ReleaseStringUTFChars(env, optionValue, locale);
} else if (optionIndex == TSDB_OPTION_CHARSET) {
const char *charset = (*env)->GetStringUTFChars(env, optionValue, NULL);
if (charset && strlen(charset) != 0) {
res = taos_options(TSDB_OPTION_CHARSET, charset);
jniDebug("set character encoding to %s, result:%d", charset, res);
} else {
jniDebug("input character encoding is empty");
}
(*env)->ReleaseStringUTFChars(env, optionValue, charset);
} else if (optionIndex == TSDB_OPTION_TIMEZONE) {
const char *tz1 = (*env)->GetStringUTFChars(env, optionValue, NULL);
if (tz1 && strlen(tz1) != 0) {
res = taos_options(TSDB_OPTION_TIMEZONE, tz1);
jniDebug("set timezone to %s, result:%d", tz1, res);
} else {
jniDebug("input timezone is empty");
}
(*env)->ReleaseStringUTFChars(env, optionValue, tz1);
} else {
jniError("option index:%d is not found", (int32_t)optionIndex);
}
return res;
}
JNIEXPORT jlong JNICALL Java_com_alibaba_datax_plugin_writer_JniConnection_connectImp(JNIEnv *env, jobject jobj,
jstring jhost, jint jport,
jstring jdbName, jstring juser,
jstring jpass) {
jlong ret = 0;
const char *host = NULL;
const char *user = NULL;
const char *pass = NULL;
const char *dbname = NULL;
if (jhost != NULL) {
host = (*env)->GetStringUTFChars(env, jhost, NULL);
}
if (jdbName != NULL) {
dbname = (*env)->GetStringUTFChars(env, jdbName, NULL);
}
if (juser != NULL) {
user = (*env)->GetStringUTFChars(env, juser, NULL);
}
if (jpass != NULL) {
pass = (*env)->GetStringUTFChars(env, jpass, NULL);
}
if (user == NULL) {
jniDebug("jobj:%p, user not specified, use default user %s", jobj, TSDB_DEFAULT_USER);
}
if (pass == NULL) {
jniDebug("jobj:%p, pass not specified, use default password", jobj);
}
ret = (jlong)taos_connect((char *)host, (char *)user, (char *)pass, (char *)dbname, (uint16_t)jport);
if (ret == 0) {
jniError("jobj:%p, conn:%p, connect to database failed, host=%s, user=%s, dbname=%s, port=%d", jobj, (void *)ret,
(char *)host, (char *)user, (char *)dbname, (int32_t)jport);
} else {
jniDebug("jobj:%p, conn:%p, connect to database succeed, host=%s, user=%s, dbname=%s, port=%d", jobj, (void *)ret,
(char *)host, (char *)user, (char *)dbname, (int32_t)jport);
}
if (host != NULL) {
(*env)->ReleaseStringUTFChars(env, jhost, host);
}
if (dbname != NULL) {
(*env)->ReleaseStringUTFChars(env, jdbName, dbname);
}
if (user != NULL) {
(*env)->ReleaseStringUTFChars(env, juser, user);
}
if (pass != NULL) {
(*env)->ReleaseStringUTFChars(env, jpass, pass);
}
return ret;
}
JNIEXPORT jint JNICALL Java_com_alibaba_datax_plugin_writer_JniConnection_getErrCodeImp(JNIEnv *env, jobject jobj,
jlong con, jlong tres) {
int32_t code = check_for_params(jobj, con, tres);
if (code != JNI_SUCCESS) {
return code;
}
return (jint)taos_errno((TAOS_RES *)tres);
}
JNIEXPORT jstring JNICALL Java_com_alibaba_datax_plugin_writer_JniConnection_getErrMsgImp(JNIEnv *env, jobject jobj,
jlong tres) {
TAOS_RES *pSql = (TAOS_RES *)tres;
return (*env)->NewStringUTF(env, (const char *)taos_errstr(pSql));
}
JNIEXPORT void JNICALL Java_com_alibaba_datax_plugin_writer_JniConnection_freeResultSetImp(JNIEnv *env, jobject jobj,
jlong con, jlong res) {
if ((TAOS *)con == NULL) {
jniError("jobj:%p, connection is closed", jobj);
}
if ((TAOS_RES *)res == NULL) {
jniError("jobj:%p, conn:%p, res is null", jobj, (TAOS *)con);
}
taos_free_result((TAOS_RES *)res);
jniDebug("jobj:%p, conn:%p, free resultset:%p", jobj, (TAOS *)con, (void *)res);
}
JNIEXPORT jint JNICALL Java_com_alibaba_datax_plugin_writer_JniConnection_closeConnectionImp(JNIEnv *env, jobject jobj,
jlong con) {
TAOS *tscon = (TAOS *)con;
if (tscon == NULL) {
jniError("jobj:%p, connection is already closed", jobj);
return JNI_CONNECTION_NULL;
} else {
jniDebug("jobj:%p, conn:%p, close connection success", jobj, tscon);
taos_close(tscon);
return JNI_SUCCESS;
}
}
JNIEXPORT jlong JNICALL Java_com_alibaba_datax_plugin_writer_JniConnection_insertOpentsdbJson(JNIEnv *env, jobject jobj,
jstring json, jlong con) {
// check connection
TAOS *conn = (TAOS *)con;
if (conn == NULL) {
jniError("jobj:%p, connection already closed", jobj);
return JNI_CONNECTION_NULL;
}
// java.lang.String -> char *
char *payload = NULL;
if (json != NULL) {
payload = (char *)(*env)->GetStringUTFChars(env, json, NULL);
}
// check payload
if (payload == NULL) {
jniDebug("jobj:%p, invalid argument: opentsdb insert json is NULL", jobj);
return JNI_SQL_NULL;
}
// schemaless insert
char *payload_arr[1];
payload_arr[0] = payload;
TAOS_RES *result;
result = taos_schemaless_insert(conn, payload_arr, 0, TSDB_SML_JSON_PROTOCOL, TSDB_SML_TIMESTAMP_NOT_CONFIGURED);
int code = taos_errno(result);
if (code != TSDB_CODE_SUCCESS) {
jniError("jobj:%p, conn:%p, code:%s, msg:%s", jobj, conn, tstrerror(code), taos_errstr(result));
} else {
int32_t affectRows = taos_affected_rows(result);
jniDebug("jobj:%p, conn:%p, code:%s, affect rows:%d", jobj, conn, tstrerror(code), affectRows);
}
(*env)->ReleaseStringUTFChars(env, json, payload);
return (jlong)result;
}
\ No newline at end of file
...@@ -1251,10 +1251,18 @@ static int32_t parseBoundColumns(SInsertStatementParam *pInsertParam, SParsedDat ...@@ -1251,10 +1251,18 @@ static int32_t parseBoundColumns(SInsertStatementParam *pInsertParam, SParsedDat
sToken = tStrGetToken(str, &index, false); sToken = tStrGetToken(str, &index, false);
str += index; str += index;
char tmpTokenBuf[TSDB_MAX_BYTES_PER_ROW] = {0}; // used for deleting Escape character backstick(`)
strncpy(tmpTokenBuf, sToken.z, sToken.n);
sToken.z = tmpTokenBuf;
if (TK_STRING == sToken.type) { if (TK_STRING == sToken.type) {
tscDequoteAndTrimToken(&sToken); tscDequoteAndTrimToken(&sToken);
} }
if (TK_ID == sToken.type) {
tscRmEscapeAndTrimToken(&sToken);
}
if (sToken.type == TK_RP) { if (sToken.type == TK_RP) {
if (end != NULL) { // set the end position if (end != NULL) { // set the end position
*end = str; *end = str;
......
...@@ -499,6 +499,7 @@ static int32_t fillDbSchema(STableMeta* tableMeta, char* tableName, SSmlSTableSc ...@@ -499,6 +499,7 @@ static int32_t fillDbSchema(STableMeta* tableMeta, char* tableName, SSmlSTableSc
for (int i=0; i<tableMeta->tableInfo.numOfColumns; ++i) { for (int i=0; i<tableMeta->tableInfo.numOfColumns; ++i) {
SSchema field; SSchema field;
tstrncpy(field.name, tableMeta->schema[i].name, strlen(tableMeta->schema[i].name)+1); tstrncpy(field.name, tableMeta->schema[i].name, strlen(tableMeta->schema[i].name)+1);
addEscapeCharToString(field.name, (int16_t)strlen(field.name));
field.type = tableMeta->schema[i].type; field.type = tableMeta->schema[i].type;
field.bytes = tableMeta->schema[i].bytes; field.bytes = tableMeta->schema[i].bytes;
taosArrayPush(schema->fields, &field); taosArrayPush(schema->fields, &field);
...@@ -510,6 +511,7 @@ static int32_t fillDbSchema(STableMeta* tableMeta, char* tableName, SSmlSTableSc ...@@ -510,6 +511,7 @@ static int32_t fillDbSchema(STableMeta* tableMeta, char* tableName, SSmlSTableSc
int j = i + tableMeta->tableInfo.numOfColumns; int j = i + tableMeta->tableInfo.numOfColumns;
SSchema field; SSchema field;
tstrncpy(field.name, tableMeta->schema[j].name, strlen(tableMeta->schema[j].name)+1); tstrncpy(field.name, tableMeta->schema[j].name, strlen(tableMeta->schema[j].name)+1);
addEscapeCharToString(field.name, (int16_t)strlen(field.name));
field.type = tableMeta->schema[j].type; field.type = tableMeta->schema[j].type;
field.bytes = tableMeta->schema[j].bytes; field.bytes = tableMeta->schema[j].bytes;
taosArrayPush(schema->tags, &field); taosArrayPush(schema->tags, &field);
...@@ -1175,6 +1177,15 @@ static void escapeSpecialCharacter(uint8_t field, const char **pos) { ...@@ -1175,6 +1177,15 @@ static void escapeSpecialCharacter(uint8_t field, const char **pos) {
*pos = cur; *pos = cur;
} }
void addEscapeCharToString(char *str, int32_t len) {
if (str == NULL) {
return;
}
memmove(str + 1, str, len);
str[0] = str[len + 1] = TS_ESCAPE_CHAR;
str[len + 2] = '\0';
}
bool isValidInteger(char *str) { bool isValidInteger(char *str) {
char *c = str; char *c = str;
if (*c != '+' && *c != '-' && !isdigit(*c)) { if (*c != '+' && *c != '-' && !isdigit(*c)) {
...@@ -1435,58 +1446,65 @@ static bool isNchar(char *pVal, uint16_t len) { ...@@ -1435,58 +1446,65 @@ static bool isNchar(char *pVal, uint16_t len) {
return false; return false;
} }
static bool isTimeStamp(char *pVal, uint16_t len, SMLTimeStampType *tsType, SSmlLinesInfo* info) { static int32_t isTimeStamp(char *pVal, uint16_t len, SMLTimeStampType *tsType, SSmlLinesInfo* info) {
if (len == 0) { if (len == 0) {
return true; return TSDB_CODE_SUCCESS;
} }
if ((len == 1) && pVal[0] == '0') { if ((len == 1) && pVal[0] == '0') {
*tsType = SML_TIME_STAMP_NOW; *tsType = SML_TIME_STAMP_NOW;
return true; return TSDB_CODE_SUCCESS;
} }
//Default no appendix for (int i = 0; i < len; ++i) {
if (isdigit(pVal[len - 1]) && isdigit(pVal[len - 2])) { if(!isdigit(pVal[i])) {
if (info->protocol == TSDB_SML_LINE_PROTOCOL) { return TSDB_CODE_TSC_INVALID_TIME_STAMP;
if (info->tsType != SML_TIME_STAMP_NOT_CONFIGURED) {
*tsType = info->tsType;
} else {
*tsType = SML_TIME_STAMP_NANO_SECONDS;
}
} else if (info->protocol == TSDB_SML_TELNET_PROTOCOL) {
if (len == SML_TIMESTAMP_SECOND_DIGITS) {
*tsType = SML_TIME_STAMP_SECONDS;
} else if (len == SML_TIMESTAMP_MILLI_SECOND_DIGITS) {
*tsType = SML_TIME_STAMP_MILLI_SECONDS;
} else {
return TSDB_CODE_TSC_INVALID_TIME_STAMP;
}
} }
return true;
} }
if (pVal[len - 1] == 's') { /* For InfluxDB line protocol use user passed timestamp precision
switch (pVal[len - 2]) { * For OpenTSDB protocols only 10 digit(seconds) or 13 digits(milliseconds)
case 'm': * precision allowed
*tsType = SML_TIME_STAMP_MILLI_SECONDS; */
break; if (info->protocol == TSDB_SML_LINE_PROTOCOL) {
case 'u': if (info->tsType != SML_TIME_STAMP_NOT_CONFIGURED) {
*tsType = SML_TIME_STAMP_MICRO_SECONDS; *tsType = info->tsType;
break; } else {
case 'n': *tsType = SML_TIME_STAMP_NANO_SECONDS;
*tsType = SML_TIME_STAMP_NANO_SECONDS; }
break; } else if (info->protocol == TSDB_SML_TELNET_PROTOCOL) {
default: if (len == SML_TIMESTAMP_SECOND_DIGITS) {
if (isdigit(pVal[len - 2])) { *tsType = SML_TIME_STAMP_SECONDS;
*tsType = SML_TIME_STAMP_SECONDS; } else if (len == SML_TIMESTAMP_MILLI_SECOND_DIGITS) {
break; *tsType = SML_TIME_STAMP_MILLI_SECONDS;
} else { } else {
return false; return TSDB_CODE_TSC_INVALID_TIME_STAMP;
}
} }
//printf("Type is timestamp(%s)\n", pVal);
return true;
} }
return false; return TSDB_CODE_SUCCESS;
//if (pVal[len - 1] == 's') {
// switch (pVal[len - 2]) {
// case 'm':
// *tsType = SML_TIME_STAMP_MILLI_SECONDS;
// break;
// case 'u':
// *tsType = SML_TIME_STAMP_MICRO_SECONDS;
// break;
// case 'n':
// *tsType = SML_TIME_STAMP_NANO_SECONDS;
// break;
// default:
// if (isdigit(pVal[len - 2])) {
// *tsType = SML_TIME_STAMP_SECONDS;
// break;
// } else {
// return false;
// }
// }
// //printf("Type is timestamp(%s)\n", pVal);
// return true;
//}
//return false;
} }
static bool convertStrToNumber(TAOS_SML_KV *pVal, char *str, SSmlLinesInfo* info) { static bool convertStrToNumber(TAOS_SML_KV *pVal, char *str, SSmlLinesInfo* info) {
...@@ -1750,14 +1768,6 @@ bool convertSmlValueType(TAOS_SML_KV *pVal, char *value, ...@@ -1750,14 +1768,6 @@ bool convertSmlValueType(TAOS_SML_KV *pVal, char *value,
static int32_t getTimeStampValue(char *value, uint16_t len, static int32_t getTimeStampValue(char *value, uint16_t len,
SMLTimeStampType type, int64_t *ts, SSmlLinesInfo* info) { SMLTimeStampType type, int64_t *ts, SSmlLinesInfo* info) {
if (len >= 2) {
for (int i = 0; i < len - 2; ++i) {
if(!isdigit(value[i])) {
return TSDB_CODE_TSC_INVALID_TIME_STAMP;
}
}
}
//No appendix or no timestamp given (len = 0) //No appendix or no timestamp given (len = 0)
if (len != 0 && type != SML_TIME_STAMP_NOW) { if (len != 0 && type != SML_TIME_STAMP_NOW) {
*ts = (int64_t)strtoll(value, NULL, 10); *ts = (int64_t)strtoll(value, NULL, 10);
...@@ -1806,13 +1816,13 @@ int32_t convertSmlTimeStamp(TAOS_SML_KV *pVal, char *value, ...@@ -1806,13 +1816,13 @@ int32_t convertSmlTimeStamp(TAOS_SML_KV *pVal, char *value,
SMLTimeStampType type; SMLTimeStampType type;
int64_t tsVal; int64_t tsVal;
strntolower_s(value, value, len); ret = isTimeStamp(value, len, &type, info);
if (!isTimeStamp(value, len, &type, info)) { if (ret != TSDB_CODE_SUCCESS) {
return TSDB_CODE_TSC_INVALID_TIME_STAMP; return ret;
} }
ret = getTimeStampValue(value, len, type, &tsVal, info); ret = getTimeStampValue(value, len, type, &tsVal, info);
if (ret) { if (ret != TSDB_CODE_SUCCESS) {
return ret; return ret;
} }
tscDebug("SML:0x%"PRIx64"Timestamp after conversion:%"PRId64, info->id, tsVal); tscDebug("SML:0x%"PRIx64"Timestamp after conversion:%"PRId64, info->id, tsVal);
...@@ -1884,15 +1894,10 @@ bool checkDuplicateKey(char *key, SHashObj *pHash, SSmlLinesInfo* info) { ...@@ -1884,15 +1894,10 @@ bool checkDuplicateKey(char *key, SHashObj *pHash, SSmlLinesInfo* info) {
static int32_t parseSmlKey(TAOS_SML_KV *pKV, const char **index, SHashObj *pHash, SSmlLinesInfo* info) { static int32_t parseSmlKey(TAOS_SML_KV *pKV, const char **index, SHashObj *pHash, SSmlLinesInfo* info) {
const char *cur = *index; const char *cur = *index;
char key[TSDB_COL_NAME_LEN + 1]; // +1 to avoid key[len] over write char key[TSDB_COL_NAME_LEN + 1]; // +1 to avoid key[len] over write
uint16_t len = 0; int16_t len = 0;
//key field cannot start with digit
if (isdigit(*cur)) {
tscError("SML:0x%"PRIx64" Tag key cannot start with digit", info->id);
return TSDB_CODE_TSC_LINE_SYNTAX_ERROR;
}
while (*cur != '\0') { while (*cur != '\0') {
if (len >= TSDB_COL_NAME_LEN - 1) { if (len > TSDB_COL_NAME_LEN - 1) {
tscError("SML:0x%"PRIx64" Key field cannot exceeds %d characters", info->id, TSDB_COL_NAME_LEN - 1); tscError("SML:0x%"PRIx64" Key field cannot exceeds %d characters", info->id, TSDB_COL_NAME_LEN - 1);
return TSDB_CODE_TSC_INVALID_COLUMN_LENGTH; return TSDB_CODE_TSC_INVALID_COLUMN_LENGTH;
} }
...@@ -1919,9 +1924,11 @@ static int32_t parseSmlKey(TAOS_SML_KV *pKV, const char **index, SHashObj *pHash ...@@ -1919,9 +1924,11 @@ static int32_t parseSmlKey(TAOS_SML_KV *pKV, const char **index, SHashObj *pHash
return TSDB_CODE_TSC_LINE_SYNTAX_ERROR; return TSDB_CODE_TSC_LINE_SYNTAX_ERROR;
} }
pKV->key = calloc(len + 1, 1); pKV->key = calloc(len + TS_ESCAPE_CHAR_SIZE + 1, 1);
memcpy(pKV->key, key, len + 1); memcpy(pKV->key, key, len + 1);
//tscDebug("SML:0x%"PRIx64" Key:%s|len:%d", info->id, pKV->key, len); strntolower_s(pKV->key, pKV->key, (int32_t)len);
addEscapeCharToString(pKV->key, len);
tscDebug("SML:0x%"PRIx64" Key:%s|len:%d", info->id, pKV->key, len);
*index = cur + 1; *index = cur + 1;
return TSDB_CODE_SUCCESS; return TSDB_CODE_SUCCESS;
} }
...@@ -1932,7 +1939,7 @@ static int32_t parseSmlValue(TAOS_SML_KV *pKV, const char **index, ...@@ -1932,7 +1939,7 @@ static int32_t parseSmlValue(TAOS_SML_KV *pKV, const char **index,
const char *start, *cur; const char *start, *cur;
int32_t ret = TSDB_CODE_SUCCESS; int32_t ret = TSDB_CODE_SUCCESS;
char *value = NULL; char *value = NULL;
uint16_t len = 0; int16_t len = 0;
bool searchQuote = false; bool searchQuote = false;
start = cur = *index; start = cur = *index;
...@@ -2013,21 +2020,15 @@ error: ...@@ -2013,21 +2020,15 @@ error:
static int32_t parseSmlMeasurement(TAOS_SML_DATA_POINT *pSml, const char **index, static int32_t parseSmlMeasurement(TAOS_SML_DATA_POINT *pSml, const char **index,
uint8_t *has_tags, SSmlLinesInfo* info) { uint8_t *has_tags, SSmlLinesInfo* info) {
const char *cur = *index; const char *cur = *index;
uint16_t len = 0; int16_t len = 0;
pSml->stableName = calloc(TSDB_TABLE_NAME_LEN + 1, 1); // +1 to avoid 1772 line over write pSml->stableName = calloc(TSDB_TABLE_NAME_LEN + TS_ESCAPE_CHAR_SIZE, 1);
if (pSml->stableName == NULL){ if (pSml->stableName == NULL){
return TSDB_CODE_TSC_OUT_OF_MEMORY; return TSDB_CODE_TSC_OUT_OF_MEMORY;
} }
if (isdigit(*cur)) {
tscError("SML:0x%"PRIx64" Measurement field cannnot start with digit", info->id);
free(pSml->stableName);
pSml->stableName = NULL;
return TSDB_CODE_TSC_LINE_SYNTAX_ERROR;
}
while (*cur != '\0') { while (*cur != '\0') {
if (len >= TSDB_TABLE_NAME_LEN - 1) { if (len > TSDB_TABLE_NAME_LEN - 1) {
tscError("SML:0x%"PRIx64" Measurement field cannot exceeds %d characters", info->id, TSDB_TABLE_NAME_LEN - 1); tscError("SML:0x%"PRIx64" Measurement field cannot exceeds %d characters", info->id, TSDB_TABLE_NAME_LEN - 1);
free(pSml->stableName); free(pSml->stableName);
pSml->stableName = NULL; pSml->stableName = NULL;
...@@ -2061,7 +2062,7 @@ static int32_t parseSmlMeasurement(TAOS_SML_DATA_POINT *pSml, const char **index ...@@ -2061,7 +2062,7 @@ static int32_t parseSmlMeasurement(TAOS_SML_DATA_POINT *pSml, const char **index
pSml->stableName = NULL; pSml->stableName = NULL;
return TSDB_CODE_TSC_LINE_SYNTAX_ERROR; return TSDB_CODE_TSC_LINE_SYNTAX_ERROR;
} }
pSml->stableName[len] = '\0'; addEscapeCharToString(pSml->stableName, len);
*index = cur + 1; *index = cur + 1;
tscDebug("SML:0x%"PRIx64" Stable name in measurement:%s|len:%d", info->id, pSml->stableName, len); tscDebug("SML:0x%"PRIx64" Stable name in measurement:%s|len:%d", info->id, pSml->stableName, len);
...@@ -2117,17 +2118,11 @@ static int32_t parseSmlKvPairs(TAOS_SML_KV **pKVs, int *num_kvs, ...@@ -2117,17 +2118,11 @@ static int32_t parseSmlKvPairs(TAOS_SML_KV **pKVs, int *num_kvs,
tscError("SML:0x%"PRIx64" Unable to parse value", info->id); tscError("SML:0x%"PRIx64" Unable to parse value", info->id);
goto error; goto error;
} }
if (!isField && (strcasecmp(pkv->key, "ID") == 0)) { if (!isField && (strcasecmp(pkv->key, "`ID`") == 0)) {
ret = isValidChildTableName(pkv->value, pkv->length, info); smlData->childTableName = malloc(pkv->length + TS_ESCAPE_CHAR_SIZE + 1);
if (ret) {
free(pkv->key);
free(pkv->value);
goto error;
}
smlData->childTableName = malloc( pkv->length + 1);
memcpy(smlData->childTableName, pkv->value, pkv->length); memcpy(smlData->childTableName, pkv->value, pkv->length);
strntolower_s(smlData->childTableName, smlData->childTableName, (int32_t)pkv->length); strntolower_s(smlData->childTableName, smlData->childTableName, (int32_t)pkv->length);
smlData->childTableName[pkv->length] = '\0'; addEscapeCharToString(smlData->childTableName, (int32_t)pkv->length);
free(pkv->key); free(pkv->key);
free(pkv->value); free(pkv->value);
} else { } else {
...@@ -2373,6 +2368,7 @@ static SSqlObj* createSmlQueryObj(TAOS* taos, int32_t affected_rows, int32_t cod ...@@ -2373,6 +2368,7 @@ static SSqlObj* createSmlQueryObj(TAOS* taos, int32_t affected_rows, int32_t cod
} }
pNew->signature = pNew; pNew->signature = pNew;
pNew->pTscObj = taos; pNew->pTscObj = taos;
pNew->fp = NULL;
tsem_init(&pNew->rspSem, 0, 0); tsem_init(&pNew->rspSem, 0, 0);
registerSqlObj(pNew); registerSqlObj(pNew);
......
...@@ -37,18 +37,20 @@ static int32_t parseTelnetMetric(TAOS_SML_DATA_POINT *pSml, const char **index, ...@@ -37,18 +37,20 @@ static int32_t parseTelnetMetric(TAOS_SML_DATA_POINT *pSml, const char **index,
const char *cur = *index; const char *cur = *index;
uint16_t len = 0; uint16_t len = 0;
pSml->stableName = tcalloc(TSDB_TABLE_NAME_LEN, 1); pSml->stableName = tcalloc(TSDB_TABLE_NAME_LEN + TS_ESCAPE_CHAR_SIZE, 1);
if (pSml->stableName == NULL) { if (pSml->stableName == NULL) {
return TSDB_CODE_TSC_OUT_OF_MEMORY; return TSDB_CODE_TSC_OUT_OF_MEMORY;
} }
/*
if (isdigit(*cur)) { if (isdigit(*cur)) {
tscError("OTD:0x%"PRIx64" Metric cannot start with digit", info->id); tscError("OTD:0x%"PRIx64" Metric cannot start with digit", info->id);
tfree(pSml->stableName); tfree(pSml->stableName);
return TSDB_CODE_TSC_LINE_SYNTAX_ERROR; return TSDB_CODE_TSC_LINE_SYNTAX_ERROR;
} }
*/
while (*cur != '\0') { while (*cur != '\0') {
if (len >= TSDB_TABLE_NAME_LEN - 1) { if (len > TSDB_TABLE_NAME_LEN - 1) {
tscError("OTD:0x%"PRIx64" Metric cannot exceeds %d characters", info->id, TSDB_TABLE_NAME_LEN - 1); tscError("OTD:0x%"PRIx64" Metric cannot exceeds %d characters", info->id, TSDB_TABLE_NAME_LEN - 1);
tfree(pSml->stableName); tfree(pSml->stableName);
return TSDB_CODE_TSC_INVALID_TABLE_ID_LENGTH; return TSDB_CODE_TSC_INVALID_TABLE_ID_LENGTH;
...@@ -63,7 +65,7 @@ static int32_t parseTelnetMetric(TAOS_SML_DATA_POINT *pSml, const char **index, ...@@ -63,7 +65,7 @@ static int32_t parseTelnetMetric(TAOS_SML_DATA_POINT *pSml, const char **index,
} }
} }
pSml->stableName[len] = *cur; pSml->stableName[len] = tolower(*cur);
cur++; cur++;
len++; len++;
...@@ -73,7 +75,7 @@ static int32_t parseTelnetMetric(TAOS_SML_DATA_POINT *pSml, const char **index, ...@@ -73,7 +75,7 @@ static int32_t parseTelnetMetric(TAOS_SML_DATA_POINT *pSml, const char **index,
return TSDB_CODE_TSC_LINE_SYNTAX_ERROR; return TSDB_CODE_TSC_LINE_SYNTAX_ERROR;
} }
pSml->stableName[len] = '\0'; addEscapeCharToString(pSml->stableName, len);
*index = cur + 1; *index = cur + 1;
tscDebug("OTD:0x%"PRIx64" Stable name in metric:%s|len:%d", info->id, pSml->stableName, len); tscDebug("OTD:0x%"PRIx64" Stable name in metric:%s|len:%d", info->id, pSml->stableName, len);
...@@ -207,12 +209,12 @@ static int32_t parseTelnetTagKey(TAOS_SML_KV *pKV, const char **index, SHashObj ...@@ -207,12 +209,12 @@ static int32_t parseTelnetTagKey(TAOS_SML_KV *pKV, const char **index, SHashObj
uint16_t len = 0; uint16_t len = 0;
//key field cannot start with digit //key field cannot start with digit
if (isdigit(*cur)) { //if (isdigit(*cur)) {
tscError("OTD:0x%"PRIx64" Tag key cannot start with digit", info->id); // tscError("OTD:0x%"PRIx64" Tag key cannot start with digit", info->id);
return TSDB_CODE_TSC_LINE_SYNTAX_ERROR; // return TSDB_CODE_TSC_LINE_SYNTAX_ERROR;
} //}
while (*cur != '\0') { while (*cur != '\0') {
if (len >= TSDB_COL_NAME_LEN - 1) { if (len > TSDB_COL_NAME_LEN - 1) {
tscError("OTD:0x%"PRIx64" Tag key cannot exceeds %d characters", info->id, TSDB_COL_NAME_LEN - 1); tscError("OTD:0x%"PRIx64" Tag key cannot exceeds %d characters", info->id, TSDB_COL_NAME_LEN - 1);
return TSDB_CODE_TSC_INVALID_COLUMN_LENGTH; return TSDB_CODE_TSC_INVALID_COLUMN_LENGTH;
} }
...@@ -236,8 +238,10 @@ static int32_t parseTelnetTagKey(TAOS_SML_KV *pKV, const char **index, SHashObj ...@@ -236,8 +238,10 @@ static int32_t parseTelnetTagKey(TAOS_SML_KV *pKV, const char **index, SHashObj
return TSDB_CODE_TSC_DUP_TAG_NAMES; return TSDB_CODE_TSC_DUP_TAG_NAMES;
} }
pKV->key = tcalloc(len + 1, 1); pKV->key = tcalloc(len + TS_ESCAPE_CHAR_SIZE + 1, 1);
memcpy(pKV->key, key, len + 1); memcpy(pKV->key, key, len + 1);
strntolower_s(pKV->key, pKV->key, (int32_t)len);
addEscapeCharToString(pKV->key, len);
//tscDebug("OTD:0x%"PRIx64" Key:%s|len:%d", info->id, pKV->key, len); //tscDebug("OTD:0x%"PRIx64" Key:%s|len:%d", info->id, pKV->key, len);
*index = cur + 1; *index = cur + 1;
return TSDB_CODE_SUCCESS; return TSDB_CODE_SUCCESS;
...@@ -312,15 +316,12 @@ static int32_t parseTelnetTagKvs(TAOS_SML_KV **pKVs, int *num_kvs, ...@@ -312,15 +316,12 @@ static int32_t parseTelnetTagKvs(TAOS_SML_KV **pKVs, int *num_kvs,
tscError("OTD:0x%"PRIx64" Unable to parse value", info->id); tscError("OTD:0x%"PRIx64" Unable to parse value", info->id);
return ret; return ret;
} }
if ((strcasecmp(pkv->key, "ID") == 0)) { if ((strcasecmp(pkv->key, "`ID`") == 0)) {
ret = isValidChildTableName(pkv->value, pkv->length, info); *childTableName = tcalloc(pkv->length + TS_ESCAPE_CHAR_SIZE + 1, 1);
if (ret) {
return ret;
}
*childTableName = malloc(pkv->length + 1);
memcpy(*childTableName, pkv->value, pkv->length); memcpy(*childTableName, pkv->value, pkv->length);
(*childTableName)[pkv->length] = '\0'; (*childTableName)[pkv->length] = '\0';
strntolower_s(*childTableName, *childTableName, (int32_t)pkv->length); strntolower_s(*childTableName, *childTableName, (int32_t)pkv->length);
addEscapeCharToString(*childTableName, pkv->length);
tfree(pkv->key); tfree(pkv->key);
tfree(pkv->value); tfree(pkv->value);
} else { } else {
...@@ -493,19 +494,22 @@ static int32_t parseMetricFromJSON(cJSON *root, TAOS_SML_DATA_POINT* pSml, SSmlL ...@@ -493,19 +494,22 @@ static int32_t parseMetricFromJSON(cJSON *root, TAOS_SML_DATA_POINT* pSml, SSmlL
return TSDB_CODE_TSC_INVALID_TABLE_ID_LENGTH; return TSDB_CODE_TSC_INVALID_TABLE_ID_LENGTH;
} }
pSml->stableName = tcalloc(stableLen + 1, sizeof(char)); pSml->stableName = tcalloc(stableLen + TS_ESCAPE_CHAR_SIZE + 1, sizeof(char));
if (pSml->stableName == NULL){ if (pSml->stableName == NULL){
return TSDB_CODE_TSC_OUT_OF_MEMORY; return TSDB_CODE_TSC_OUT_OF_MEMORY;
} }
/*
if (isdigit(metric->valuestring[0])) { if (isdigit(metric->valuestring[0])) {
tscError("OTD:0x%"PRIx64" Metric cannot start with digit in JSON", info->id); tscError("OTD:0x%"PRIx64" Metric cannot start with digit in JSON", info->id);
tfree(pSml->stableName); tfree(pSml->stableName);
return TSDB_CODE_TSC_INVALID_JSON; return TSDB_CODE_TSC_INVALID_JSON;
} }
*/
tstrncpy(pSml->stableName, metric->valuestring, stableLen + 1); tstrncpy(pSml->stableName, metric->valuestring, stableLen + 1);
strntolower_s(pSml->stableName, pSml->stableName, (int32_t)stableLen); strntolower_s(pSml->stableName, pSml->stableName, (int32_t)stableLen);
addEscapeCharToString(pSml->stableName, stableLen);
return TSDB_CODE_SUCCESS; return TSDB_CODE_SUCCESS;
...@@ -888,7 +892,6 @@ static int32_t parseTagsFromJSON(cJSON *root, TAOS_SML_KV **pKVs, int *num_kvs, ...@@ -888,7 +892,6 @@ static int32_t parseTagsFromJSON(cJSON *root, TAOS_SML_KV **pKVs, int *num_kvs,
if (tags == NULL || tags->type != cJSON_Object) { if (tags == NULL || tags->type != cJSON_Object) {
return TSDB_CODE_TSC_INVALID_JSON; return TSDB_CODE_TSC_INVALID_JSON;
} }
//only pick up the first ID value as child table name //only pick up the first ID value as child table name
cJSON *id = cJSON_GetObjectItem(tags, "ID"); cJSON *id = cJSON_GetObjectItem(tags, "ID");
if (id != NULL) { if (id != NULL) {
...@@ -897,13 +900,10 @@ static int32_t parseTagsFromJSON(cJSON *root, TAOS_SML_KV **pKVs, int *num_kvs, ...@@ -897,13 +900,10 @@ static int32_t parseTagsFromJSON(cJSON *root, TAOS_SML_KV **pKVs, int *num_kvs,
return TSDB_CODE_TSC_INVALID_JSON; return TSDB_CODE_TSC_INVALID_JSON;
} }
size_t idLen = strlen(id->valuestring); size_t idLen = strlen(id->valuestring);
ret = isValidChildTableName(id->valuestring, (int16_t)idLen, info); *childTableName = tcalloc(idLen + TS_ESCAPE_CHAR_SIZE + 1, sizeof(char));
if (ret != TSDB_CODE_SUCCESS) {
return ret;
}
*childTableName = tcalloc(idLen + 1, sizeof(char));
memcpy(*childTableName, id->valuestring, idLen); memcpy(*childTableName, id->valuestring, idLen);
strntolower_s(*childTableName, *childTableName, (int32_t)idLen); strntolower_s(*childTableName, *childTableName, (int32_t)idLen);
addEscapeCharToString(*childTableName, idLen);
//check duplicate IDs //check duplicate IDs
cJSON_DeleteItemFromObject(tags, "ID"); cJSON_DeleteItemFromObject(tags, "ID");
...@@ -912,7 +912,6 @@ static int32_t parseTagsFromJSON(cJSON *root, TAOS_SML_KV **pKVs, int *num_kvs, ...@@ -912,7 +912,6 @@ static int32_t parseTagsFromJSON(cJSON *root, TAOS_SML_KV **pKVs, int *num_kvs,
return TSDB_CODE_TSC_DUP_TAG_NAMES; return TSDB_CODE_TSC_DUP_TAG_NAMES;
} }
} }
int32_t tagNum = cJSON_GetArraySize(tags); int32_t tagNum = cJSON_GetArraySize(tags);
//at least one tag pair required //at least one tag pair required
if (tagNum <= 0) { if (tagNum <= 0) {
...@@ -938,8 +937,10 @@ static int32_t parseTagsFromJSON(cJSON *root, TAOS_SML_KV **pKVs, int *num_kvs, ...@@ -938,8 +937,10 @@ static int32_t parseTagsFromJSON(cJSON *root, TAOS_SML_KV **pKVs, int *num_kvs,
tscError("OTD:0x%"PRIx64" Tag key cannot exceeds %d characters in JSON", info->id, TSDB_COL_NAME_LEN - 1); tscError("OTD:0x%"PRIx64" Tag key cannot exceeds %d characters in JSON", info->id, TSDB_COL_NAME_LEN - 1);
return TSDB_CODE_TSC_INVALID_COLUMN_LENGTH; return TSDB_CODE_TSC_INVALID_COLUMN_LENGTH;
} }
pkv->key = tcalloc(keyLen + 1, sizeof(char)); pkv->key = tcalloc(keyLen + TS_ESCAPE_CHAR_SIZE + 1, sizeof(char));
strncpy(pkv->key, tag->string, keyLen); strncpy(pkv->key, tag->string, keyLen);
strntolower_s(pkv->key, pkv->key, (int32_t)keyLen);
addEscapeCharToString(pkv->key, keyLen);
//value //value
ret = parseValueFromJSON(tag, pkv, info); ret = parseValueFromJSON(tag, pkv, info);
if (ret != TSDB_CODE_SUCCESS) { if (ret != TSDB_CODE_SUCCESS) {
......
...@@ -3257,6 +3257,14 @@ static int16_t doGetColumnIndex(SQueryInfo* pQueryInfo, int32_t index, SStrToken ...@@ -3257,6 +3257,14 @@ static int16_t doGetColumnIndex(SQueryInfo* pQueryInfo, int32_t index, SStrToken
int16_t columnIndex = COLUMN_INDEX_INITIAL_VAL; int16_t columnIndex = COLUMN_INDEX_INITIAL_VAL;
char tmpTokenBuf[TSDB_MAX_BYTES_PER_ROW] = {0}; // create tmp buf to avoid alter orginal sqlstr
strncpy(tmpTokenBuf, pToken->z, pToken->n);
pToken->z = tmpTokenBuf;
if (pToken->type == TK_ID) {
tscRmEscapeAndTrimToken(pToken);
}
for (int16_t i = 0; i < numOfCols; ++i) { for (int16_t i = 0; i < numOfCols; ++i) {
if (pToken->n != strlen(pSchema[i].name)) { if (pToken->n != strlen(pSchema[i].name)) {
continue; continue;
...@@ -6423,6 +6431,13 @@ int32_t setAlterTableInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) { ...@@ -6423,6 +6431,13 @@ int32_t setAlterTableInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) {
SColumnIndex columnIndex = COLUMN_INDEX_INITIALIZER; SColumnIndex columnIndex = COLUMN_INDEX_INITIALIZER;
SStrToken name = {.type = TK_STRING, .z = pItem->name, .n = (uint32_t)strlen(pItem->name)}; SStrToken name = {.type = TK_STRING, .z = pItem->name, .n = (uint32_t)strlen(pItem->name)};
//handle Escape character backstick
if (name.z[0] == TS_ESCAPE_CHAR && name.z[name.n - 1] == TS_ESCAPE_CHAR) {
memmove(name.z, name.z + 1, name.n);
name.z[name.n - TS_ESCAPE_CHAR_SIZE] = '\0';
name.n -= TS_ESCAPE_CHAR_SIZE;
}
if (getColumnIndexByName(&name, pQueryInfo, &columnIndex, tscGetErrorMsgPayload(pCmd)) != TSDB_CODE_SUCCESS) { if (getColumnIndexByName(&name, pQueryInfo, &columnIndex, tscGetErrorMsgPayload(pCmd)) != TSDB_CODE_SUCCESS) {
return invalidOperationMsg(pMsg, msg17); return invalidOperationMsg(pMsg, msg17);
} }
...@@ -6764,6 +6779,9 @@ int32_t validateColumnName(char* name) { ...@@ -6764,6 +6779,9 @@ int32_t validateColumnName(char* name) {
} }
return validateColumnName(token.z); return validateColumnName(token.z);
} else if (token.type == TK_ID) {
strRmquoteEscape(name, token.n);
return TSDB_CODE_SUCCESS;
} else { } else {
if (isNumber(&token)) { if (isNumber(&token)) {
return TSDB_CODE_TSC_INVALID_OPERATION; return TSDB_CODE_TSC_INVALID_OPERATION;
...@@ -7844,7 +7862,7 @@ int32_t doCheckForCreateFromStable(SSqlObj* pSql, SSqlInfo* pInfo) { ...@@ -7844,7 +7862,7 @@ int32_t doCheckForCreateFromStable(SSqlObj* pSql, SSqlInfo* pInfo) {
SCreatedTableInfo* pCreateTableInfo = taosArrayGet(pCreateTable->childTableInfo, j); SCreatedTableInfo* pCreateTableInfo = taosArrayGet(pCreateTable->childTableInfo, j);
SStrToken* pToken = &pCreateTableInfo->stableName; SStrToken* pToken = &pCreateTableInfo->stableName;
bool dbIncluded = false; bool dbIncluded = false;
char buf[TSDB_TABLE_FNAME_LEN]; char buf[TSDB_TABLE_FNAME_LEN];
SStrToken sTblToken; SStrToken sTblToken;
...@@ -7904,10 +7922,19 @@ int32_t doCheckForCreateFromStable(SSqlObj* pSql, SSqlInfo* pInfo) { ...@@ -7904,10 +7922,19 @@ int32_t doCheckForCreateFromStable(SSqlObj* pSql, SSqlInfo* pInfo) {
for (int32_t i = 0; i < nameSize; ++i) { for (int32_t i = 0; i < nameSize; ++i) {
SStrToken* sToken = taosArrayGet(pNameList, i); SStrToken* sToken = taosArrayGet(pNameList, i);
char tmpTokenBuf[TSDB_MAX_BYTES_PER_ROW] = {0}; // create tmp buf to avoid alter orginal sqlstr
strncpy(tmpTokenBuf, sToken->z, sToken->n);
sToken->z = tmpTokenBuf;
if (TK_STRING == sToken->type) { if (TK_STRING == sToken->type) {
tscDequoteAndTrimToken(sToken); tscDequoteAndTrimToken(sToken);
} }
if (TK_ID == sToken->type) {
tscRmEscapeAndTrimToken(sToken);
}
tVariantListItem* pItem = taosArrayGet(pValList, i); tVariantListItem* pItem = taosArrayGet(pValList, i);
findColumnIndex = false; findColumnIndex = false;
......
...@@ -629,6 +629,10 @@ static bool hasAdditionalErrorInfo(int32_t code, SSqlCmd *pCmd) { ...@@ -629,6 +629,10 @@ static bool hasAdditionalErrorInfo(int32_t code, SSqlCmd *pCmd) {
return false; return false;
} }
if (pCmd->payload == NULL) {
return false;
}
size_t len = strlen(pCmd->payload); size_t len = strlen(pCmd->payload);
char *z = NULL; char *z = NULL;
......
import taos import taos
from taos import SmlProtocol, SmlPrecision
conn = taos.connect() conn = taos.connect()
dbname = "pytest_line" dbname = "pytest_line"
...@@ -9,10 +10,10 @@ conn.select_db(dbname) ...@@ -9,10 +10,10 @@ conn.select_db(dbname)
lines = [ lines = [
'st,t1=3i64,t2=4f64,t3="t3" c1=3i64,c3=L"pass",c2=false,c4=4f64 1626006833639000000', 'st,t1=3i64,t2=4f64,t3="t3" c1=3i64,c3=L"pass",c2=false,c4=4f64 1626006833639000000',
] ]
conn.schemaless_insert(lines, 0, "ns") conn.schemaless_insert(lines, taos.SmlProtocol.LINE_PROTOCOL, taos.SmlPrecision.NOT_CONFIGURED)
print("inserted") print("inserted")
conn.schemaless_insert(lines, 0, "ns") conn.schemaless_insert(lines, taos.SmlProtocol.LINE_PROTOCOL, taos.SmlPrecision.NOT_CONFIGURED)
result = conn.query("show tables") result = conn.query("show tables")
for row in result: for row in result:
......
[tool.poetry] [tool.poetry]
name = "taos" name = "taos"
version = "2.1.0" version = "2.1.1"
description = "TDengine connector for python" description = "TDengine connector for python"
authors = ["Taosdata Inc. <support@taosdata.com>"] authors = ["Taosdata Inc. <support@taosdata.com>"]
license = "AGPL-3.0" license = "AGPL-3.0"
......
...@@ -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.1.0", version="2.1.1",
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",
......
...@@ -440,6 +440,7 @@ from .cursor import * ...@@ -440,6 +440,7 @@ from .cursor import *
from .result import * from .result import *
from .statement import * from .statement import *
from .subscription import * from .subscription import *
from .schemaless import *
try: try:
import importlib.metadata import importlib.metadata
...@@ -468,6 +469,8 @@ __all__ = [ ...@@ -468,6 +469,8 @@ __all__ = [
"TaosRow", "TaosRow",
"TaosStmt", "TaosStmt",
"PrecisionEnum", "PrecisionEnum",
"SmlPrecision",
"SmlProtocol"
] ]
def connect(*args, **kwargs): def connect(*args, **kwargs):
......
...@@ -12,6 +12,7 @@ except: ...@@ -12,6 +12,7 @@ except:
from .error import * from .error import *
from .bind import * from .bind import *
from .field import * from .field import *
from .schemaless import *
# stream callback # stream callback
...@@ -64,6 +65,8 @@ _libtaos.taos_consume.restype = ctypes.c_void_p ...@@ -64,6 +65,8 @@ _libtaos.taos_consume.restype = ctypes.c_void_p
_libtaos.taos_fetch_lengths.restype = ctypes.POINTER(ctypes.c_int) _libtaos.taos_fetch_lengths.restype = ctypes.POINTER(ctypes.c_int)
_libtaos.taos_free_result.restype = None _libtaos.taos_free_result.restype = None
_libtaos.taos_query.restype = ctypes.POINTER(ctypes.c_void_p) _libtaos.taos_query.restype = ctypes.POINTER(ctypes.c_void_p)
_libtaos.taos_schemaless_insert.restype = ctypes.c_void_p
try: try:
_libtaos.taos_stmt_errstr.restype = c_char_p _libtaos.taos_stmt_errstr.restype = c_char_p
except AttributeError: except AttributeError:
...@@ -808,30 +811,27 @@ def taos_stmt_use_result(stmt): ...@@ -808,30 +811,27 @@ def taos_stmt_use_result(stmt):
return result return result
try: try:
_libtaos.taos_insert_lines.restype = c_int _libtaos.taos_schemaless_insert.restype = c_void_p
_libtaos.taos_insert_lines.argstype = c_void_p, c_void_p, c_int _libtaos.taos_schemaless_insert.argstype = c_void_p, c_void_p, c_int, c_int, c_int
except AttributeError: except AttributeError:
print("WARNING: libtaos(%s) does not support insert_lines" % taos_get_client_info()) print("WARNING: libtaos(%s) does not support taos_schemaless_insert" % taos_get_client_info())
def taos_schemaless_insert(connection, lines, protocol, precision): def taos_schemaless_insert(connection, lines, protocol, precision):
# type: (c_void_p, list[str] | tuple(str)) -> None # type: (c_void_p, list[str] | tuple(str), SmlProtocol, SmlPrecision) -> int
num_of_lines = len(lines) num_of_lines = len(lines)
lines = (c_char_p(line.encode("utf-8")) for line in lines) lines = (c_char_p(line.encode("utf-8")) for line in lines)
lines_type = ctypes.c_char_p * num_of_lines lines_type = ctypes.c_char_p * num_of_lines
p_lines = lines_type(*lines) p_lines = lines_type(*lines)
res = c_void_p(_libtaos.taos_schemaless_insert(connection, p_lines, num_of_lines, protocol, precision)) res = c_void_p(_libtaos.taos_schemaless_insert(connection, p_lines, num_of_lines, protocol, precision))
errno = taos_errno(res) errno = taos_errno(res)
affected_rows = taos_affected_rows(res)
if errno != 0: if errno != 0:
errstr = taos_errstr(res) errstr = taos_errstr(res)
taos_free_result(res) taos_free_result(res)
print("schemaless_insert error affected rows: {}".format(taos_affected_rows(res))) raise SchemalessError(errstr, errno, affected_rows)
raise SchemalessError(errstr, errno)
taos_free_result(res) taos_free_result(res)
return errno return affected_rows
class CTaosInterface(object): class CTaosInterface(object):
def __init__(self, config=None): def __init__(self, config=None):
......
...@@ -72,10 +72,9 @@ class TaosConnection(object): ...@@ -72,10 +72,9 @@ class TaosConnection(object):
taos_select_db(self._conn, database) taos_select_db(self._conn, database)
def execute(self, sql): def execute(self, sql):
# type: (str) -> None # type: (str) -> int
"""Simplely execute sql ignoring the results""" """Simplely execute sql ignoring the results"""
res = taos_query(self._conn, sql) return self.query(sql).affected_rows
taos_free_result(res)
def query(self, sql): def query(self, sql):
# type: (str) -> TaosResult # type: (str) -> TaosResult
...@@ -118,7 +117,7 @@ class TaosConnection(object): ...@@ -118,7 +117,7 @@ class TaosConnection(object):
return TaosStream(stream) return TaosStream(stream)
def schemaless_insert(self, lines, protocol, precision): def schemaless_insert(self, lines, protocol, precision):
# type: (list[str]) -> None # type: (list[str], SmlProtocol, SmlPrecision) -> int
""" """
1.Line protocol and schemaless support 1.Line protocol and schemaless support
...@@ -171,6 +170,7 @@ class TaosConnection(object): ...@@ -171,6 +170,7 @@ class TaosConnection(object):
conn.schemaless_insert(lines, 2, None) conn.schemaless_insert(lines, 2, None)
""" """
print(lines, protocol, precision)
return taos_schemaless_insert(self._conn, lines, protocol, precision) return taos_schemaless_insert(self._conn, lines, protocol, precision)
......
...@@ -83,7 +83,16 @@ class ResultError(DatabaseError): ...@@ -83,7 +83,16 @@ class ResultError(DatabaseError):
class SchemalessError(DatabaseError): class SchemalessError(DatabaseError):
"""taos_schemaless_insert errors.""" """taos_schemaless_insert errors."""
pass def __init__(self, msg=None, errno=0xffff, affected_rows=0):
DatabaseError.__init__(self, msg, errno)
self.affected_rows = affected_rows
def __str__(self):
return self._full_msg + "(affected rows: %d)" % self.affected_rows
# @property
# def affected_rows(self):
# return self.affected_rows
class StatementError(DatabaseError): class StatementError(DatabaseError):
......
...@@ -123,6 +123,12 @@ class TaosResult(object): ...@@ -123,6 +123,12 @@ class TaosResult(object):
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 fetch_all_into_dict(self):
"""Fetch all rows and convert it to dict"""
names = [field.name for field in self.fields]
rows = self.fetch_all()
return list(dict(zip(names, row)) for row in rows)
def fetch_rows_a(self, callback, param): def fetch_rows_a(self, callback, param):
taos_fetch_rows_a(self._result, callback, param) taos_fetch_rows_a(self._result, callback, param)
...@@ -228,6 +234,12 @@ class TaosRow: ...@@ -228,6 +234,12 @@ class TaosRow:
blocks[i] = CONVERT_FUNC[fields[i].type](data, 1, field_lens[i], precision)[0] blocks[i] = CONVERT_FUNC[fields[i].type](data, 1, field_lens[i], precision)[0]
return tuple(blocks) return tuple(blocks)
def as_dict(self):
values = self.as_tuple()
names = self._result.fields
dict(zip(names, values))
class TaosBlocks: class TaosBlocks:
"""TDengine result blocks iterator""" """TDengine result blocks iterator"""
......
class SmlPrecision:
"""Schemaless timestamp precision constants"""
NOT_CONFIGURED = 0 # C.TSDB_SML_TIMESTAMP_NOT_CONFIGURED
HOURS = 1
MINUTES = 2
SECONDS = 3
MILLI_SECONDS = 4
MICRO_SECONDS = 5
NANO_SECONDS = 6
class SmlProtocol:
"""Schemaless protocol constants"""
UNKNOWN_PROTOCOL = 0
LINE_PROTOCOL = 1
TELNET_PROTOCOL = 2
JSON_PROTOCOL = 3
\ No newline at end of file
from taos.error import OperationalError from taos.error import OperationalError, SchemalessError
from taos import connect, new_bind_params, PrecisionEnum from taos import connect, new_bind_params, PrecisionEnum
from taos import * from taos import *
...@@ -13,32 +13,95 @@ def conn(): ...@@ -13,32 +13,95 @@ def conn():
return connect() return connect()
def test_schemaless_insert_update_2(conn):
# type: (TaosConnection) -> None
dbname = "test_schemaless_insert_update_2"
try:
conn.execute("drop database if exists %s" % dbname)
conn.execute("create database if not exists %s update 2 precision 'ns'" % dbname)
conn.select_db(dbname)
lines = [
'st,t1=4i64,t3="t4",t2=5f64,t4=5f64 c1=3i64,c3=L"passitagin, abc",c2=true,c4=5f64,c5=5f64,c6=7u64 1626006933640000000',
]
res = conn.schemaless_insert(lines, 1, 0)
print("affected rows: ", res)
assert(res == 1)
result = conn.query("select * from st")
[before] = result.fetch_all_into_dict()
assert(before["c3"] == "passitagin, abc")
lines = [
'st,t1=4i64,t3="t4",t2=5f64,t4=5f64 c1=3i64,c3=L"passitagin",c2=true,c4=5f64,c5=5f64,c6=7u64 1626006933640000000',
]
res = conn.schemaless_insert(lines, 1, 0)
result = conn.query("select * from st")
[after] = result.fetch_all_into_dict()
assert(after["c3"] == "passitagin")
conn.execute("drop database if exists %s" % dbname)
conn.close()
except Exception as err:
conn.execute("drop database if exists %s" % dbname)
conn.close()
print(err)
raise err
def test_schemaless_insert(conn): def test_schemaless_insert(conn):
# type: (TaosConnection) -> None # type: (TaosConnection) -> None
dbname = "pytest_taos_schemaless_insert" dbname = "pytest_taos_schemaless_insert"
try: try:
conn.execute("drop database if exists %s" % dbname) conn.execute("drop database if exists %s" % dbname)
conn.execute("create database if not exists %s precision 'us'" % dbname) conn.execute("create database if not exists %s update 2 precision 'ns'" % dbname)
conn.select_db(dbname) conn.select_db(dbname)
lines = [ lines = [
'st,t1=3i64,t2=4f64,t3="t3" c1=3i64,c3=L"passit",c2=false,c4=4f64 1626006833639000000', 'st,t1=3i64,t2=4f64,t3="t3" c1=3i64,c3=L"passit",c2=false,c4=4f64 1626006833639000000',
'st,t1=4i64,t3="t4",t2=5f64,t4=5f64 c1=3i64,c3=L"passitagin",c2=true,c4=5f64,c5=5f64,c6=7u64 1626006933640000000', 'st,t1=4i64,t3="t4",t2=5f64,t4=5f64 c1=3i64,c3=L"passitagin, abc",c2=true,c4=5f64,c5=5f64,c6=7u64 1626006933640000000',
'stf,t1=4i64,t3="t4",t2=5f64,t4=5f64 c1=3i64,c3=L"passitagin_stf",c2=false,c5=5f64,c6=7u64 1626006933641000000', 'stf,t1=4i64,t3="t4",t2=5f64,t4=5f64 c1=3i64,c3=L"passitagin_stf",c2=false,c5=5f64,c6=7u64 1626006933641000000',
] ]
conn.schemaless_insert(lines, 0, "ns") res = conn.schemaless_insert(lines, 1, 0)
print("affected rows: ", res)
assert(res == 3)
lines = [ lines = [
'stf,t1=5i64,t3="t4",t2=5f64,t4=5f64 c1=3i64,c3=L"passitagin_stf",c2=false,c5=5f64,c6=7u64 1626006933641000000', 'stf,t1=5i64,t3="t4",t2=5f64,t4=5f64 c1=3i64,c3=L"passitagin_stf",c2=false,c5=5f64,c6=7u64 1626006933641000000',
] ]
conn.schemaless_insert(lines, 0, "ns") res = conn.schemaless_insert(lines, 1, 0)
print("affected rows: ", res)
assert(res == 1)
result = conn.query("select * from st")
dict2 = result.fetch_all_into_dict()
print(dict2)
result.row_count
all = result.rows_iter()
for row in all:
print(row)
result.close()
assert(result.row_count == 2)
# error test
lines = [
',t1=3i64,t2=4f64,t3="t3" c1=3i64,c3=L"passit",c2=false,c4=4f64 1626006833639000000',
]
try:
res = conn.schemaless_insert(lines, 1, 0)
print(res)
# assert(False)
except SchemalessError as err:
pass
result = conn.query("select * from st") result = conn.query("select * from st")
result.row_count
all = result.rows_iter() all = result.rows_iter()
for row in all: for row in all:
print(row) print(row)
result.close() result.close()
print(result.row_count)
conn.execute("drop database if exists %s" % dbname) conn.execute("drop database if exists %s" % dbname)
conn.close() conn.close()
...@@ -52,3 +115,4 @@ def test_schemaless_insert(conn): ...@@ -52,3 +115,4 @@ def test_schemaless_insert(conn):
if __name__ == "__main__": if __name__ == "__main__":
test_schemaless_insert(connect()) test_schemaless_insert(connect())
test_schemaless_insert_update_2(connect())
# encoding:UTF-8
from taos import * from taos import *
from ctypes import * from ctypes import *
......
...@@ -99,6 +99,7 @@ extern const int32_t TYPE_BYTES[15]; ...@@ -99,6 +99,7 @@ extern const int32_t TYPE_BYTES[15];
#define TS_PATH_DELIMITER "." #define TS_PATH_DELIMITER "."
#define TS_ESCAPE_CHAR '`' #define TS_ESCAPE_CHAR '`'
#define TS_ESCAPE_CHAR_SIZE 2
#define TSDB_TIME_PRECISION_MILLI 0 #define TSDB_TIME_PRECISION_MILLI 0
#define TSDB_TIME_PRECISION_MICRO 1 #define TSDB_TIME_PRECISION_MICRO 1
......
...@@ -421,9 +421,6 @@ bool tsdbNoProblem(STsdbRepo* pRepo); ...@@ -421,9 +421,6 @@ bool tsdbNoProblem(STsdbRepo* pRepo);
// unit of walSize: MB // unit of walSize: MB
int tsdbCheckWal(STsdbRepo *pRepo, uint32_t walSize); int tsdbCheckWal(STsdbRepo *pRepo, uint32_t walSize);
// not commit if other instances in committing state or waiting to commit
bool tsdbIsNeedCommit(STsdbRepo *pRepo);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
......
...@@ -77,6 +77,7 @@ extern char configDir[]; ...@@ -77,6 +77,7 @@ extern char configDir[];
#define MAX_DATA_SIZE (16*TSDB_MAX_COLUMNS)+20 // max record len: 16*MAX_COLUMNS, timestamp string and ,('') need extra space #define MAX_DATA_SIZE (16*TSDB_MAX_COLUMNS)+20 // max record len: 16*MAX_COLUMNS, timestamp string and ,('') need extra space
#define OPT_ABORT 1 /* –abort */ #define OPT_ABORT 1 /* –abort */
#define MAX_FILE_NAME_LEN 256 // max file name length on linux is 255. #define MAX_FILE_NAME_LEN 256 // max file name length on linux is 255.
#define MAX_PATH_LEN 4096
#define DEFAULT_START_TIME 1500000000000 #define DEFAULT_START_TIME 1500000000000
...@@ -511,7 +512,7 @@ typedef struct SThreadInfo_S { ...@@ -511,7 +512,7 @@ typedef struct SThreadInfo_S {
int threadID; int threadID;
char db_name[TSDB_DB_NAME_LEN]; char db_name[TSDB_DB_NAME_LEN];
uint32_t time_precision; uint32_t time_precision;
char filePath[384]; char filePath[MAX_PATH_LEN];
FILE *fp; FILE *fp;
char tb_prefix[TSDB_TABLE_NAME_LEN]; char tb_prefix[TSDB_TABLE_NAME_LEN];
uint64_t start_table_from; uint64_t start_table_from;
...@@ -3481,8 +3482,14 @@ static int postProceSql(char *host, uint16_t port, ...@@ -3481,8 +3482,14 @@ static int postProceSql(char *host, uint16_t port,
'w', 'x', 'y', 'z', '0', '1', '2', '3', 'w', 'x', 'y', 'z', '0', '1', '2', '3',
'4', '5', '6', '7', '8', '9', '+', '/'}; '4', '5', '6', '7', '8', '9', '+', '/'};
snprintf(userpass_buf, INPUT_BUF_LEN, "%s:%s", if (g_args.test_mode == INSERT_TEST) {
g_Dbs.user, g_Dbs.password); snprintf(userpass_buf, INPUT_BUF_LEN, "%s:%s",
g_Dbs.user, g_Dbs.password);
} else {
snprintf(userpass_buf, INPUT_BUF_LEN, "%s:%s",
g_queryInfo.user, g_queryInfo.password);
}
size_t userpass_buf_len = strlen(userpass_buf); size_t userpass_buf_len = strlen(userpass_buf);
size_t encoded_len = 4 * ((userpass_buf_len +2) / 3); size_t encoded_len = 4 * ((userpass_buf_len +2) / 3);
...@@ -3574,7 +3581,7 @@ static int postProceSql(char *host, uint16_t port, ...@@ -3574,7 +3581,7 @@ static int postProceSql(char *host, uint16_t port,
"%s() LN%d: received:%d resp_len:%d, response_buf:\n%s\n", "%s() LN%d: received:%d resp_len:%d, response_buf:\n%s\n",
__func__, __LINE__, received, resp_len, response_buf); __func__, __LINE__, received, resp_len, response_buf);
break; break;
} }
} }
} while(received < resp_len); } while(received < resp_len);
...@@ -4380,7 +4387,7 @@ static int createSuperTable( ...@@ -4380,7 +4387,7 @@ static int createSuperTable(
superTbl->lenOfTagOfOneRow = lenOfTagOfOneRow; superTbl->lenOfTagOfOneRow = lenOfTagOfOneRow;
snprintf(command, BUFFER_SIZE, snprintf(command, BUFFER_SIZE,
superTbl->escapeChar ? superTbl->escapeChar ?
"CREATE TABLE IF NOT EXISTS %s.`%s` (ts TIMESTAMP%s) TAGS %s": "CREATE TABLE IF NOT EXISTS %s.`%s` (ts TIMESTAMP%s) TAGS %s":
...@@ -4515,7 +4522,7 @@ int createDatabasesAndStables(char *command) { ...@@ -4515,7 +4522,7 @@ int createDatabasesAndStables(char *command) {
if (g_Dbs.db[i].superTbls[j].iface == SML_IFACE) { if (g_Dbs.db[i].superTbls[j].iface == SML_IFACE) {
goto skip; goto skip;
} }
sprintf(command, "describe %s.%s;", g_Dbs.db[i].dbName, sprintf(command, "describe %s.%s;", g_Dbs.db[i].dbName,
g_Dbs.db[i].superTbls[j].stbName); g_Dbs.db[i].superTbls[j].stbName);
ret = queryDbExec(taos, command, NO_INSERT_TYPE, true); ret = queryDbExec(taos, command, NO_INSERT_TYPE, true);
...@@ -4575,7 +4582,7 @@ static void* createTable(void *sarg) ...@@ -4575,7 +4582,7 @@ static void* createTable(void *sarg)
i <= pThreadInfo->end_table_to; i++) { i <= pThreadInfo->end_table_to; i++) {
if (0 == g_Dbs.use_metric) { if (0 == g_Dbs.use_metric) {
snprintf(pThreadInfo->buffer, buff_len, snprintf(pThreadInfo->buffer, buff_len,
g_args.escapeChar ? g_args.escapeChar ?
"CREATE TABLE IF NOT EXISTS %s.`%s%"PRIu64"` %s;" : "CREATE TABLE IF NOT EXISTS %s.`%s%"PRIu64"` %s;" :
"CREATE TABLE IF NOT EXISTS %s.%s%"PRIu64" %s;", "CREATE TABLE IF NOT EXISTS %s.%s%"PRIu64" %s;",
pThreadInfo->db_name, pThreadInfo->db_name,
...@@ -6604,7 +6611,7 @@ static int getRowDataFromSample( ...@@ -6604,7 +6611,7 @@ static int getRowDataFromSample(
stbInfo->sampleDataBuf stbInfo->sampleDataBuf
+ stbInfo->lenOfOneRow * (*sampleUsePos)); + stbInfo->lenOfOneRow * (*sampleUsePos));
} }
dataLen += snprintf(dataBuf + dataLen, maxLen - dataLen, ")"); dataLen += snprintf(dataBuf + dataLen, maxLen - dataLen, ")");
(*sampleUsePos)++; (*sampleUsePos)++;
...@@ -7139,7 +7146,7 @@ static void getTableName(char *pTblName, ...@@ -7139,7 +7146,7 @@ static void getTableName(char *pTblName,
if (stbInfo) { if (stbInfo) {
if (AUTO_CREATE_SUBTBL != stbInfo->autoCreateTable) { if (AUTO_CREATE_SUBTBL != stbInfo->autoCreateTable) {
if (stbInfo->childTblLimit > 0) { if (stbInfo->childTblLimit > 0) {
snprintf(pTblName, TSDB_TABLE_NAME_LEN, snprintf(pTblName, TSDB_TABLE_NAME_LEN,
stbInfo->escapeChar ? "`%s`" : "%s", stbInfo->escapeChar ? "`%s`" : "%s",
stbInfo->childTblName + stbInfo->childTblName +
(tableSeq - stbInfo->childTblOffset) * TSDB_TABLE_NAME_LEN); (tableSeq - stbInfo->childTblOffset) * TSDB_TABLE_NAME_LEN);
...@@ -7152,12 +7159,12 @@ static void getTableName(char *pTblName, ...@@ -7152,12 +7159,12 @@ static void getTableName(char *pTblName,
stbInfo->childTblName + tableSeq * TSDB_TABLE_NAME_LEN); stbInfo->childTblName + tableSeq * TSDB_TABLE_NAME_LEN);
} }
} else { } else {
snprintf(pTblName, TSDB_TABLE_NAME_LEN, snprintf(pTblName, TSDB_TABLE_NAME_LEN,
stbInfo->escapeChar ? "`%s%"PRIu64"`" : "%s%"PRIu64"", stbInfo->escapeChar ? "`%s%"PRIu64"`" : "%s%"PRIu64"",
stbInfo->childTblPrefix, tableSeq); stbInfo->childTblPrefix, tableSeq);
} }
} else { } else {
snprintf(pTblName, TSDB_TABLE_NAME_LEN, snprintf(pTblName, TSDB_TABLE_NAME_LEN,
g_args.escapeChar ? "`%s%"PRIu64"`" : "%s%"PRIu64"", g_args.escapeChar ? "`%s%"PRIu64"`" : "%s%"PRIu64"",
g_args.tb_prefix, tableSeq); g_args.tb_prefix, tableSeq);
} }
...@@ -9713,7 +9720,7 @@ static void generateSmlHead(char* smlHead, SSuperTable* stbInfo, threadInfo* pTh ...@@ -9713,7 +9720,7 @@ static void generateSmlHead(char* smlHead, SSuperTable* stbInfo, threadInfo* pTh
} }
} }
static void generateSmlTail(char* line, char* smlHead, SSuperTable* stbInfo, static void generateSmlTail(char* line, char* smlHead, SSuperTable* stbInfo,
threadInfo* pThreadInfo, int64_t timestamp) { threadInfo* pThreadInfo, int64_t timestamp) {
int dataLen = 0; int dataLen = 0;
dataLen = snprintf(line, BUFFER_SIZE, "%s ", smlHead); dataLen = snprintf(line, BUFFER_SIZE, "%s ", smlHead);
...@@ -9860,7 +9867,7 @@ static void* syncWriteInterlaceSml(threadInfo *pThreadInfo, uint32_t interlaceRo ...@@ -9860,7 +9867,7 @@ static void* syncWriteInterlaceSml(threadInfo *pThreadInfo, uint32_t interlaceRo
} else { } else {
batchPerTblTimes = 1; batchPerTblTimes = 1;
} }
char *smlHead[pThreadInfo->ntables]; char *smlHead[pThreadInfo->ntables];
for (int t = 0; t < pThreadInfo->ntables; t++) { for (int t = 0; t < pThreadInfo->ntables; t++) {
smlHead[t] = (char *)calloc(HEAD_BUFF_LEN, 1); smlHead[t] = (char *)calloc(HEAD_BUFF_LEN, 1);
...@@ -9869,7 +9876,7 @@ static void* syncWriteInterlaceSml(threadInfo *pThreadInfo, uint32_t interlaceRo ...@@ -9869,7 +9876,7 @@ static void* syncWriteInterlaceSml(threadInfo *pThreadInfo, uint32_t interlaceRo
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
generateSmlHead(smlHead[t], stbInfo, pThreadInfo, t); generateSmlHead(smlHead[t], stbInfo, pThreadInfo, t);
} }
pThreadInfo->totalInsertRows = 0; pThreadInfo->totalInsertRows = 0;
...@@ -9895,11 +9902,11 @@ static void* syncWriteInterlaceSml(threadInfo *pThreadInfo, uint32_t interlaceRo ...@@ -9895,11 +9902,11 @@ static void* syncWriteInterlaceSml(threadInfo *pThreadInfo, uint32_t interlaceRo
pThreadInfo->lines = calloc(g_args.reqPerReq, sizeof(char *)); pThreadInfo->lines = calloc(g_args.reqPerReq, sizeof(char *));
if (NULL == pThreadInfo->lines) { if (NULL == pThreadInfo->lines) {
errorPrint2("Failed to alloc %"PRIu64" bytes, reason:%s\n", errorPrint2("Failed to alloc %"PRIu64" bytes, reason:%s\n",
g_args.reqPerReq * sizeof(char *), g_args.reqPerReq * (uint64_t)sizeof(char *),
strerror(errno)); strerror(errno));
return NULL; return NULL;
} }
while(pThreadInfo->totalInsertRows < pThreadInfo->ntables * insertRows) { while(pThreadInfo->totalInsertRows < pThreadInfo->ntables * insertRows) {
if ((flagSleep) && (insert_interval)) { if ((flagSleep) && (insert_interval)) {
st = taosGetTimestampMs(); st = taosGetTimestampMs();
...@@ -10470,7 +10477,7 @@ static void* syncWriteProgressiveSml(threadInfo *pThreadInfo) { ...@@ -10470,7 +10477,7 @@ static void* syncWriteProgressiveSml(threadInfo *pThreadInfo) {
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
generateSmlHead(smlHead[t], stbInfo, pThreadInfo, t); generateSmlHead(smlHead[t], stbInfo, pThreadInfo, t);
} }
int currentPercent = 0; int currentPercent = 0;
int percentComplete = 0; int percentComplete = 0;
...@@ -10481,14 +10488,14 @@ static void* syncWriteProgressiveSml(threadInfo *pThreadInfo) { ...@@ -10481,14 +10488,14 @@ static void* syncWriteProgressiveSml(threadInfo *pThreadInfo) {
pThreadInfo->lines = calloc(g_args.reqPerReq, sizeof(char *)); pThreadInfo->lines = calloc(g_args.reqPerReq, sizeof(char *));
if (NULL == pThreadInfo->lines) { if (NULL == pThreadInfo->lines) {
errorPrint2("Failed to alloc %"PRIu64" bytes, reason:%s\n", errorPrint2("Failed to alloc %"PRIu64" bytes, reason:%s\n",
g_args.reqPerReq * sizeof(char *), g_args.reqPerReq * (uint64_t)sizeof(char *),
strerror(errno)); strerror(errno));
return NULL; return NULL;
} }
for (uint64_t i = 0; i < pThreadInfo->ntables; i++) { for (uint64_t i = 0; i < pThreadInfo->ntables; i++) {
int64_t timestamp = pThreadInfo->start_time; int64_t timestamp = pThreadInfo->start_time;
for (uint64_t j = 0; j < insertRows;) { for (uint64_t j = 0; j < insertRows;) {
for (int k = 0; k < g_args.reqPerReq; k++) { for (int k = 0; k < g_args.reqPerReq; k++) {
pThreadInfo->lines[k] = calloc(BUFFER_SIZE, 1); pThreadInfo->lines[k] = calloc(BUFFER_SIZE, 1);
...@@ -10956,7 +10963,7 @@ static void startMultiThreadInsertData(int threads, char* db_name, ...@@ -10956,7 +10963,7 @@ static void startMultiThreadInsertData(int threads, char* db_name,
int64_t ntables = 0; int64_t ntables = 0;
uint64_t tableFrom; uint64_t tableFrom;
if (stbInfo) { if (stbInfo) {
if (stbInfo->iface != SML_IFACE) { if (stbInfo->iface != SML_IFACE) {
int64_t limit; int64_t limit;
...@@ -11198,7 +11205,7 @@ static void startMultiThreadInsertData(int threads, char* db_name, ...@@ -11198,7 +11205,7 @@ static void startMultiThreadInsertData(int threads, char* db_name,
pThreadInfo->start_time = pThreadInfo->start_time + rand_int() % 10000 - rand_tinyint(); pThreadInfo->start_time = pThreadInfo->start_time + rand_int() % 10000 - rand_tinyint();
} }
*/ */
if (g_args.iface == REST_IFACE || ((stbInfo) && (stbInfo->iface == REST_IFACE))) { if (g_args.iface == REST_IFACE || ((stbInfo) && (stbInfo->iface == REST_IFACE))) {
#ifdef WINDOWS #ifdef WINDOWS
WSADATA wsaData; WSADATA wsaData;
...@@ -11223,7 +11230,7 @@ static void startMultiThreadInsertData(int threads, char* db_name, ...@@ -11223,7 +11230,7 @@ static void startMultiThreadInsertData(int threads, char* db_name,
} }
pThreadInfo->sockfd = sockfd; pThreadInfo->sockfd = sockfd;
} }
tsem_init(&(pThreadInfo->lock_sem), 0, 0); tsem_init(&(pThreadInfo->lock_sem), 0, 0);
if (ASYNC_MODE == g_Dbs.asyncMode) { if (ASYNC_MODE == g_Dbs.asyncMode) {
......
...@@ -2091,7 +2091,7 @@ static int getTableDes( ...@@ -2091,7 +2091,7 @@ static int getTableDes(
memset(tableDes->cols[i].value, 0, sizeof(tableDes->cols[i].note)); memset(tableDes->cols[i].value, 0, sizeof(tableDes->cols[i].note));
char tbuf[COL_NOTE_LEN-2]; // need reserve 2 bytes for ' ' char tbuf[COL_NOTE_LEN-2]; // need reserve 2 bytes for ' '
convertNCharToReadable((char *)row[TSDB_SHOW_TABLES_NAME_INDEX], length[0], tbuf, COL_NOTE_LEN); convertNCharToReadable((char *)row[TSDB_SHOW_TABLES_NAME_INDEX], length[0], tbuf, COL_NOTE_LEN);
sprintf(tableDes->cols[i].value, "\'%s\'", tbuf); sprintf(tableDes->cols[i].value, "%s", tbuf);
break; break;
} }
case TSDB_DATA_TYPE_TIMESTAMP: case TSDB_DATA_TYPE_TIMESTAMP:
......
...@@ -185,19 +185,10 @@ int tsdbUnlockRepo(STsdbRepo *pRepo) { ...@@ -185,19 +185,10 @@ int tsdbUnlockRepo(STsdbRepo *pRepo) {
return 0; return 0;
} }
bool tsdbIsNeedCommit(STsdbRepo *pRepo) {
int nVal = 0;
if (sem_getvalue(&pRepo->readyToCommit, &nVal) != 0) {
tsdbError("vgId:%d failed to sem_getvalue of readyToCommit", REPO_ID(pRepo));
return false;
}
return nVal > 0;
}
int tsdbCheckWal(STsdbRepo *pRepo, uint32_t walSize) { // MB int tsdbCheckWal(STsdbRepo *pRepo, uint32_t walSize) { // MB
STsdbCfg *pCfg = &(pRepo->config); STsdbCfg *pCfg = &(pRepo->config);
if ((walSize > tsdbWalFlushSize) && (walSize > (pCfg->totalBlocks / 2 * pCfg->cacheBlockSize))) { if ((walSize > tsdbWalFlushSize) && (walSize > (pCfg->totalBlocks / 2 * pCfg->cacheBlockSize))) {
if (tsdbIsNeedCommit(pRepo) && (tsdbAsyncCommit(pRepo) < 0)) return -1; if (tsdbAsyncCommit(pRepo) < 0) return -1;
} }
return 0; return 0;
} }
...@@ -211,7 +202,7 @@ int tsdbCheckCommit(STsdbRepo *pRepo) { ...@@ -211,7 +202,7 @@ int tsdbCheckCommit(STsdbRepo *pRepo) {
if ((pRepo->mem->extraBuffList != NULL) || if ((pRepo->mem->extraBuffList != NULL) ||
((listNEles(pRepo->mem->bufBlockList) >= pCfg->totalBlocks / 3) && (pBufBlock->remain < TSDB_BUFFER_RESERVE))) { ((listNEles(pRepo->mem->bufBlockList) >= pCfg->totalBlocks / 3) && (pBufBlock->remain < TSDB_BUFFER_RESERVE))) {
// trigger commit // trigger commit
if (tsdbIsNeedCommit(pRepo) && (tsdbAsyncCommit(pRepo) < 0)) return -1; if (tsdbAsyncCommit(pRepo) < 0) return -1;
} }
return 0; return 0;
} }
......
...@@ -628,7 +628,7 @@ SStrToken tStrGetToken(char* str, int32_t* i, bool isPrevOptr) { ...@@ -628,7 +628,7 @@ SStrToken tStrGetToken(char* str, int32_t* i, bool isPrevOptr) {
t0.n = 0; t0.n = 0;
return t0; return t0;
} }
t = str[++(*i)]; t = str[++(*i)];
} }
......
...@@ -53,13 +53,13 @@ int32_t strdequote(char *z) { ...@@ -53,13 +53,13 @@ int32_t strdequote(char *z) {
} }
int32_t strRmquote(char *z, int32_t len){ int32_t strRmquote(char *z, int32_t len){
// delete escape character: \\, \', \" // delete escape character: \\, \', \"
char delim = z[0]; char delim = z[0];
if (delim != '\'' && delim != '\"') { if (delim != '\'' && delim != '\"') {
return len; return len;
} }
int32_t cnt = 0; int32_t cnt = 0;
int32_t j = 0; int32_t j = 0;
for (uint32_t k = 1; k < len - 1; ++k) { for (uint32_t k = 1; k < len - 1; ++k) {
...@@ -74,23 +74,24 @@ int32_t strRmquote(char *z, int32_t len){ ...@@ -74,23 +74,24 @@ int32_t strRmquote(char *z, int32_t len){
continue; continue;
} }
} }
z[j] = z[k]; z[j] = z[k];
j++; j++;
} }
z[j] = 0; z[j] = 0;
return len - 2 - cnt; return len - 2 - cnt;
} }
int32_t strRmquoteEscape(char *z, int32_t len) { int32_t strRmquoteEscape(char *z, int32_t len) {
if (len <= 0) return len; if (len <= 0) return len;
if (z[0] == '\'' || z[0] == '\"') { if (z[0] == '\'' || z[0] == '\"') {
return strRmquote(z, len); return strRmquote(z, len);
} else if (len > 1 && z[0] == TS_ESCAPE_CHAR && z[len - 1] == TS_ESCAPE_CHAR) { } else if (len > 1 && z[0] == TS_ESCAPE_CHAR && z[len - 1] == TS_ESCAPE_CHAR) {
memmove(z, z + 1, len - 2); memmove(z, z + 1, len - 2);
z[len - 2] = '\0';
return len - 2; return len - 2;
} }
......
...@@ -169,7 +169,7 @@ static int32_t vnodeProcessSubmitMsg(SVnodeObj *pVnode, void *pCont, SRspRet *pR ...@@ -169,7 +169,7 @@ static int32_t vnodeProcessSubmitMsg(SVnodeObj *pVnode, void *pCont, SRspRet *pR
} }
static int32_t vnodeCheckWal(SVnodeObj *pVnode) { static int32_t vnodeCheckWal(SVnodeObj *pVnode) {
if (tsdbIsNeedCommit(pVnode->tsdb)) { if (pVnode->isCommiting == 0) {
return tsdbCheckWal(pVnode->tsdb, walGetFSize(pVnode->wal) >> 20); return tsdbCheckWal(pVnode->tsdb, walGetFSize(pVnode->wal) >> 20);
} }
return 0; return 0;
...@@ -189,7 +189,7 @@ static int32_t vnodeProcessCreateTableMsg(SVnodeObj *pVnode, void *pCont, SRspRe ...@@ -189,7 +189,7 @@ static int32_t vnodeProcessCreateTableMsg(SVnodeObj *pVnode, void *pCont, SRspRe
ASSERT(code != 0); ASSERT(code != 0);
} }
if (((++pVnode->tblMsgVer) & 16383) == 0) { // lazy check if (((++pVnode->tblMsgVer) & 32767) == 0) { // lazy check
vnodeCheckWal(pVnode); vnodeCheckWal(pVnode);
} }
......
...@@ -15,7 +15,7 @@ static void prepare_data(TAOS* taos) { ...@@ -15,7 +15,7 @@ static void prepare_data(TAOS* taos) {
result = taos_query(taos, "drop database if exists test;"); result = taos_query(taos, "drop database if exists test;");
taos_free_result(result); taos_free_result(result);
usleep(100000); usleep(100000);
result = taos_query(taos, "create database test precision 'us';"); result = taos_query(taos, "create database test precision 'ns';");
taos_free_result(result); taos_free_result(result);
usleep(100000); usleep(100000);
taos_select_db(taos, "test"); taos_select_db(taos, "test");
...@@ -293,7 +293,7 @@ void verify_schema_less(TAOS* taos) { ...@@ -293,7 +293,7 @@ void verify_schema_less(TAOS* taos) {
result = taos_query(taos, "drop database if exists test;"); result = taos_query(taos, "drop database if exists test;");
taos_free_result(result); taos_free_result(result);
usleep(100000); usleep(100000);
result = taos_query(taos, "create database test precision 'us' update 1;"); result = taos_query(taos, "create database test precision 'ns' update 1 keep 36500;");
taos_free_result(result); taos_free_result(result);
usleep(100000); usleep(100000);
...@@ -401,6 +401,21 @@ void verify_schema_less(TAOS* taos) { ...@@ -401,6 +401,21 @@ void verify_schema_less(TAOS* taos) {
} }
taos_free_result(result); taos_free_result(result);
//Test timestamp precision
char* lines7[] = {
"stts,t1=10i64,t2=4f64,t3=\"t3\" c1=3i64,c3=L\"passit\",c2=false,c4=4f64 1",
};
for (int precision = TSDB_SML_TIMESTAMP_HOURS; precision <= TSDB_SML_TIMESTAMP_NANO_SECONDS; ++precision) {
result = taos_schemaless_insert(taos, lines7, 1, TSDB_SML_LINE_PROTOCOL, precision);
code = taos_errno(result);
if (code != TSDB_CODE_SUCCESS) {
affected_rows = taos_affected_rows(result);
printf("\033[31m [lines7_%d]taos_schemaless_insert failed, code: %d,%s, affected rows:%d \033[0m\n", precision, code, taos_errstr(result), affected_rows);
}
taos_free_result(result);
}
} }
int main(int argc, char* argv[]) { int main(int argc, char* argv[]) {
......
...@@ -92,7 +92,7 @@ static void null_event(ep_t *ep, struct epoll_event *ev, fde_t *client); ...@@ -92,7 +92,7 @@ static void null_event(ep_t *ep, struct epoll_event *ev, fde_t *client);
fprintf(stderr, "" fmt "\n", ##__VA_ARGS__); \ fprintf(stderr, "" fmt "\n", ##__VA_ARGS__); \
} \ } \
fprintf(stderr, "usage:\n"); \ fprintf(stderr, "usage:\n"); \
fprintf(stderr, " %s -l <port> : specify listenning port\n", arg0); \ fprintf(stderr, " %s -l <port> : specify listening port\n", arg0); \
} while (0) } while (0)
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
...@@ -256,7 +256,7 @@ static int open_listen(unsigned short port) { ...@@ -256,7 +256,7 @@ static int open_listen(unsigned short port) {
E("getsockname() failed"); E("getsockname() failed");
} }
A(len == sizeof(si), "internal logic error"); A(len == sizeof(si), "internal logic error");
D("listenning at: %d", ntohs(si.sin_port)); D("listening at: %d", ntohs(si.sin_port));
return skt; return skt;
} while (0); } while (0);
close(skt); close(skt);
......
...@@ -36,7 +36,8 @@ class TwoClients: ...@@ -36,7 +36,8 @@ class TwoClients:
tdDnodes.deploy(1) tdDnodes.deploy(1)
tdDnodes.start(1) tdDnodes.start(1)
# first client create a stable and insert data tdLog.sleep(2)
# first client create a stable and insert data
conn1 = taos.connect(host=self.host, user=self.user, password=self.password, config=tdDnodes.getSimCfgPath()) conn1 = taos.connect(host=self.host, user=self.user, password=self.password, config=tdDnodes.getSimCfgPath())
cursor1 = conn1.cursor() cursor1 = conn1.cursor()
cursor1.execute("drop database if exists db") cursor1.execute("drop database if exists db")
...@@ -90,6 +91,8 @@ class TwoClients: ...@@ -90,6 +91,8 @@ class TwoClients:
cursor2.close() cursor2.close()
conn1.close() conn1.close()
conn2.close() conn2.close()
tdLog.success("%s successfully executed" % __file__)
clients = TwoClients() clients = TwoClients()
clients.initConnection() clients.initConnection()
......
...@@ -313,7 +313,7 @@ python3 testNoCompress.py ...@@ -313,7 +313,7 @@ python3 testNoCompress.py
python3 testMinTablesPerVnode.py python3 testMinTablesPerVnode.py
python3 queryCount.py python3 queryCount.py
python3 ./test.py -f query/queryGroupbyWithInterval.py python3 ./test.py -f query/queryGroupbyWithInterval.py
#python3 client/twoClients.py python3 client/twoClients.py
python3 test.py -f query/queryInterval.py python3 test.py -f query/queryInterval.py
python3 test.py -f query/queryFillTest.py python3 test.py -f query/queryFillTest.py
# subscribe # subscribe
......
...@@ -418,10 +418,14 @@ class TDTestCase: ...@@ -418,10 +418,14 @@ class TDTestCase:
tdSql.execute("use db") tdSql.execute("use db")
tdSql.execute("create stable db.stb1 (ts timestamp, c1 int) tags(t1 int)") tdSql.execute("create stable db.stb1 (ts timestamp, c1 int) tags(t1 int)")
nowtime = int(round(time.time() * 1000))
for i in range(1000): for i in range(1000):
tdSql.execute(f"create table db.t1{i} using db.stb1 tags({i})") tdSql.execute(f"create table db.t1{i} using db.stb1 tags({i})")
sql = f"insert into db.t1{i} values"
for j in range(260): for j in range(260):
tdSql.execute(f"insert into db.t1{i} values (now-100d, {i+j})") sql += f"({nowtime-1000*i-j}, {i+j})"
# tdSql.execute(f"insert into db.t1{i} values (now-100d, {i+j})")
tdSql.execute(sql)
# tdDnodes.stop(dnode_index) # tdDnodes.stop(dnode_index)
# tdDnodes.start(dnode_index) # tdDnodes.start(dnode_index)
...@@ -465,7 +469,7 @@ class TDTestCase: ...@@ -465,7 +469,7 @@ class TDTestCase:
# tdSql.execute("insert into db.t1 values ('2021-07-01 08:00:04.000', 1001.51, 1001.52, 1001.53, 1001.54)") # tdSql.execute("insert into db.t1 values ('2021-07-01 08:00:04.000', 1001.51, 1001.52, 1001.53, 1001.54)")
# for i in range(1000000): # for i in range(1000000):
for i in range(1000000): for i in range(10000):
random1 = random.uniform(1000,1001) random1 = random.uniform(1000,1001)
random2 = random.uniform(1000,1001) random2 = random.uniform(1000,1001)
random3 = random.uniform(1000,1001) random3 = random.uniform(1000,1001)
......
...@@ -36,7 +36,7 @@ class TDTestCase: ...@@ -36,7 +36,7 @@ class TDTestCase:
print("============= step0 : test metric ================") print("============= step0 : test metric ================")
payload = [''' payload = ['''
{ {
"metric": "`.stb.0.`", "metric": ".stb.0.",
"timestamp": 1626006833610, "timestamp": 1626006833610,
"value": 10, "value": 10,
"tags": { "tags": {
...@@ -664,6 +664,183 @@ class TDTestCase: ...@@ -664,6 +664,183 @@ class TDTestCase:
tdSql.checkData(9, 1, "BINARY") tdSql.checkData(9, 1, "BINARY")
tdSql.checkData(10, 1, "NCHAR") tdSql.checkData(10, 1, "NCHAR")
### special characters ###
payload = ['''
{
"metric": "1234",
"timestamp": 1626006833,
"value": 1,
"tags": {
"id": "123",
"456": true,
"int": false,
"double": 1,
"into": 1,
"from": 2,
"!@#$.%^&*()": "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>"
}
}
''']
code = self._conn.schemaless_insert(payload, TDSmlProtocolType.JSON.value, TDSmlTimestampType.NOT_CONFIGURED.value)
print("schemaless_insert result {}".format(code))
tdSql.query("describe `1234`")
tdSql.checkRows(8)
tdSql.query("select * from `123`")
tdSql.checkRows(1)
payload = ['''
{
"metric": "int",
"timestamp": 1626006833,
"value": 1,
"tags": {
"id": "and",
"456": true,
"int": false,
"double": 1,
"into": 1,
"from": 2,
"!@#$.%^&*()": "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>"
}
}
''']
code = self._conn.schemaless_insert(payload, TDSmlProtocolType.JSON.value, TDSmlTimestampType.NOT_CONFIGURED.value)
print("schemaless_insert result {}".format(code))
tdSql.query("describe `int`")
tdSql.checkRows(8)
tdSql.query("select * from `and`")
tdSql.checkRows(1)
payload = ['''
{
"metric": "double",
"timestamp": 1626006833,
"value": 1,
"tags": {
"id": "for",
"456": true,
"int": false,
"double": 1,
"into": 1,
"from": 2,
"!@#$.%^&*()": "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>"
}
}
''']
code = self._conn.schemaless_insert(payload, TDSmlProtocolType.JSON.value, TDSmlTimestampType.NOT_CONFIGURED.value)
print("schemaless_insert result {}".format(code))
tdSql.query("describe `double`")
tdSql.checkRows(8)
tdSql.query("select * from `for`")
tdSql.checkRows(1)
payload = ['''
{
"metric": "from",
"timestamp": 1626006833,
"value": 1,
"tags": {
"id": "!@#.^&",
"456": true,
"int": false,
"double": 1,
"into": 1,
"from": 2,
"!@#$.%^&*()": "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>"
}
}
''']
code = self._conn.schemaless_insert(payload, TDSmlProtocolType.JSON.value, TDSmlTimestampType.NOT_CONFIGURED.value)
print("schemaless_insert result {}".format(code))
tdSql.query("describe `from`")
tdSql.checkRows(8)
tdSql.query("select * from `!@#.^&`")
tdSql.checkRows(1)
payload = ['''
{
"metric": "!@#$.%^&*()",
"timestamp": 1626006833,
"value": 1,
"tags": {
"id": "none",
"456": true,
"int": false,
"double": 1,
"into": 1,
"from": 2,
"!@#$.%^&*()": "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>"
}
}
''']
code = self._conn.schemaless_insert(payload, TDSmlProtocolType.JSON.value, TDSmlTimestampType.NOT_CONFIGURED.value)
print("schemaless_insert result {}".format(code))
tdSql.query("describe `!@#$.%^&*()`")
tdSql.checkRows(8)
tdSql.query("select * from `none`")
tdSql.checkRows(1)
payload = ['''
{
"metric": "STABLE",
"timestamp": {
"value": 1626006833,
"type": "s"
},
"value": {
"value": "hello",
"type": "nchar"
},
"tags": {
"id": "KEY",
"456": {
"value": true,
"type": "bool"
},
"int": {
"value": 127,
"type": "tinyint"
},
"double":{
"value": 32767,
"type": "smallint"
},
"into": {
"value": 2147483647,
"type": "int"
},
"INSERT": {
"value": 9.2233720368547758e+18,
"type": "bigint"
},
"!@#$.%^&*()": {
"value": 11.12345,
"type": "float"
}
}
}
''']
code = self._conn.schemaless_insert(payload, TDSmlProtocolType.JSON.value, TDSmlTimestampType.NOT_CONFIGURED.value)
print("schemaless_insert result {}".format(code))
tdSql.query("describe `stable`")
tdSql.checkRows(8)
tdSql.query("select * from `key`")
tdSql.checkRows(1)
def stop(self): def stop(self):
tdSql.close() tdSql.close()
......
...@@ -35,7 +35,7 @@ class TDTestCase: ...@@ -35,7 +35,7 @@ class TDTestCase:
"stb0_0 1626006833639000000ns 4i8 host=\"host0\" interface=\"eth0\"", "stb0_0 1626006833639000000ns 4i8 host=\"host0\" interface=\"eth0\"",
"stb0_1 1626006833639000000ns 4i8 host=\"host0\" interface=\"eth0\"", "stb0_1 1626006833639000000ns 4i8 host=\"host0\" interface=\"eth0\"",
"stb0_2 1626006833639000000ns 4i8 host=\"host0\" interface=\"eth0\"", "stb0_2 1626006833639000000ns 4i8 host=\"host0\" interface=\"eth0\"",
"`.stb0.3.` 1626006833639000000ns 4i8 host=\"host0\" interface=\"eth0\"", ".stb0.3. 1626006833639000000ns 4i8 host=\"host0\" interface=\"eth0\"",
] ]
code = self._conn.schemaless_insert(lines0, TDSmlProtocolType.TELNET.value, TDSmlTimestampType.NOT_CONFIGURED.value) code = self._conn.schemaless_insert(lines0, TDSmlProtocolType.TELNET.value, TDSmlTimestampType.NOT_CONFIGURED.value)
...@@ -59,28 +59,24 @@ class TDTestCase: ...@@ -59,28 +59,24 @@ class TDTestCase:
### timestamp ### ### timestamp ###
print("============= step2 : test timestamp ================") print("============= step2 : test timestamp ================")
lines1 = [ lines1 = [
"stb1 1626006833s 1i8 host=\"host0\"", "stb1 1626006833641 1i8 host=\"host0\"",
"stb1 1626006833639000000ns 2i8 host=\"host0\"", "stb1 1626006834 2i8 host=\"host0\"",
"stb1 1626006833640000us 3i8 host=\"host0\"", "stb1 0 3i8 host=\"host0\"",
"stb1 1626006833641 4i8 host=\"host0\"",
"stb1 1626006834 5i8 host=\"host0\"",
"stb1 1626006833651ms 6i8 host=\"host0\"",
"stb1 0 7i8 host=\"host0\"",
] ]
code = self._conn.schemaless_insert(lines1, TDSmlProtocolType.TELNET.value, TDSmlTimestampType.NOT_CONFIGURED.value) code = self._conn.schemaless_insert(lines1, TDSmlProtocolType.TELNET.value, TDSmlTimestampType.NOT_CONFIGURED.value)
print("schemaless_insert result {}".format(code)) print("schemaless_insert result {}".format(code))
tdSql.query("select * from stb1") tdSql.query("select * from stb1")
tdSql.checkRows(7) tdSql.checkRows(3)
### metric value ### ### metric value ###
print("============= step3 : test metric value ================") print("============= step3 : test metric value ================")
#tinyint #tinyint
lines2_0 = [ lines2_0 = [
"stb2_0 1626006833651ms -127i8 host=\"host0\"", "stb2_0 1626006833651 -127i8 host=\"host0\"",
"stb2_0 1626006833652ms 127i8 host=\"host0\"" "stb2_0 1626006833652 127i8 host=\"host0\""
] ]
code = self._conn.schemaless_insert(lines2_0, TDSmlProtocolType.TELNET.value, TDSmlTimestampType.NOT_CONFIGURED.value) code = self._conn.schemaless_insert(lines2_0, TDSmlProtocolType.TELNET.value, TDSmlTimestampType.NOT_CONFIGURED.value)
print("schemaless_insert result {}".format(code)) print("schemaless_insert result {}".format(code))
...@@ -94,8 +90,8 @@ class TDTestCase: ...@@ -94,8 +90,8 @@ class TDTestCase:
#smallint #smallint
lines2_1 = [ lines2_1 = [
"stb2_1 1626006833651ms -32767i16 host=\"host0\"", "stb2_1 1626006833651 -32767i16 host=\"host0\"",
"stb2_1 1626006833652ms 32767i16 host=\"host0\"" "stb2_1 1626006833652 32767i16 host=\"host0\""
] ]
code = self._conn.schemaless_insert(lines2_1, TDSmlProtocolType.TELNET.value, TDSmlTimestampType.NOT_CONFIGURED.value) code = self._conn.schemaless_insert(lines2_1, TDSmlProtocolType.TELNET.value, TDSmlTimestampType.NOT_CONFIGURED.value)
print("schemaless_insert result {}".format(code)) print("schemaless_insert result {}".format(code))
...@@ -109,8 +105,8 @@ class TDTestCase: ...@@ -109,8 +105,8 @@ class TDTestCase:
#int #int
lines2_2 = [ lines2_2 = [
"stb2_2 1626006833651ms -2147483647i32 host=\"host0\"", "stb2_2 1626006833651 -2147483647i32 host=\"host0\"",
"stb2_2 1626006833652ms 2147483647i32 host=\"host0\"" "stb2_2 1626006833652 2147483647i32 host=\"host0\""
] ]
code = self._conn.schemaless_insert(lines2_2, TDSmlProtocolType.TELNET.value, TDSmlTimestampType.NOT_CONFIGURED.value) code = self._conn.schemaless_insert(lines2_2, TDSmlProtocolType.TELNET.value, TDSmlTimestampType.NOT_CONFIGURED.value)
...@@ -125,8 +121,8 @@ class TDTestCase: ...@@ -125,8 +121,8 @@ class TDTestCase:
#bigint #bigint
lines2_3 = [ lines2_3 = [
"stb2_3 1626006833651ms -9223372036854775807i64 host=\"host0\"", "stb2_3 1626006833651 -9223372036854775807i64 host=\"host0\"",
"stb2_3 1626006833652ms 9223372036854775807i64 host=\"host0\"" "stb2_3 1626006833652 9223372036854775807i64 host=\"host0\""
] ]
code = self._conn.schemaless_insert(lines2_3, TDSmlProtocolType.TELNET.value, TDSmlTimestampType.NOT_CONFIGURED.value) code = self._conn.schemaless_insert(lines2_3, TDSmlProtocolType.TELNET.value, TDSmlTimestampType.NOT_CONFIGURED.value)
...@@ -141,16 +137,16 @@ class TDTestCase: ...@@ -141,16 +137,16 @@ class TDTestCase:
#float #float
lines2_4 = [ lines2_4 = [
"stb2_4 1626006833610ms 3f32 host=\"host0\"", "stb2_4 1626006833610 3f32 host=\"host0\"",
"stb2_4 1626006833620ms -3f32 host=\"host0\"", "stb2_4 1626006833620 -3f32 host=\"host0\"",
"stb2_4 1626006833630ms 3.4f32 host=\"host0\"", "stb2_4 1626006833630 3.4f32 host=\"host0\"",
"stb2_4 1626006833640ms -3.4f32 host=\"host0\"", "stb2_4 1626006833640 -3.4f32 host=\"host0\"",
"stb2_4 1626006833650ms 3.4E10f32 host=\"host0\"", "stb2_4 1626006833650 3.4E10f32 host=\"host0\"",
"stb2_4 1626006833660ms -3.4e10f32 host=\"host0\"", "stb2_4 1626006833660 -3.4e10f32 host=\"host0\"",
"stb2_4 1626006833670ms 3.4E+2f32 host=\"host0\"", "stb2_4 1626006833670 3.4E+2f32 host=\"host0\"",
"stb2_4 1626006833680ms -3.4e-2f32 host=\"host0\"", "stb2_4 1626006833680 -3.4e-2f32 host=\"host0\"",
"stb2_4 1626006833700ms 3.4E38f32 host=\"host0\"", "stb2_4 1626006833700 3.4E38f32 host=\"host0\"",
"stb2_4 1626006833710ms -3.4E38f32 host=\"host0\"" "stb2_4 1626006833710 -3.4E38f32 host=\"host0\""
] ]
code = self._conn.schemaless_insert(lines2_4, TDSmlProtocolType.TELNET.value, TDSmlTimestampType.NOT_CONFIGURED.value) code = self._conn.schemaless_insert(lines2_4, TDSmlProtocolType.TELNET.value, TDSmlTimestampType.NOT_CONFIGURED.value)
...@@ -165,17 +161,17 @@ class TDTestCase: ...@@ -165,17 +161,17 @@ class TDTestCase:
#double #double
lines2_5 = [ lines2_5 = [
"stb2_5 1626006833610ms 3f64 host=\"host0\"", "stb2_5 1626006833610 3f64 host=\"host0\"",
"stb2_5 1626006833620ms -3f64 host=\"host0\"", "stb2_5 1626006833620 -3f64 host=\"host0\"",
"stb2_5 1626006833630ms 3.4f64 host=\"host0\"", "stb2_5 1626006833630 3.4f64 host=\"host0\"",
"stb2_5 1626006833640ms -3.4f64 host=\"host0\"", "stb2_5 1626006833640 -3.4f64 host=\"host0\"",
"stb2_5 1626006833650ms 3.4E10f64 host=\"host0\"", "stb2_5 1626006833650 3.4E10f64 host=\"host0\"",
"stb2_5 1626006833660ms -3.4e10f64 host=\"host0\"", "stb2_5 1626006833660 -3.4e10f64 host=\"host0\"",
"stb2_5 1626006833670ms 3.4E+2f64 host=\"host0\"", "stb2_5 1626006833670 3.4E+2f64 host=\"host0\"",
"stb2_5 1626006833680ms -3.4e-2f64 host=\"host0\"", "stb2_5 1626006833680 -3.4e-2f64 host=\"host0\"",
"stb2_5 1626006833690ms 1.7E308f64 host=\"host0\"", "stb2_5 1626006833690 1.7E308f64 host=\"host0\"",
"stb2_5 1626006833700ms -1.7E308f64 host=\"host0\"", "stb2_5 1626006833700 -1.7E308f64 host=\"host0\"",
"stb2_5 1626006833710ms 3 host=\"host0\"" "stb2_5 1626006833710 3 host=\"host0\""
] ]
code = self._conn.schemaless_insert(lines2_5, TDSmlProtocolType.TELNET.value, TDSmlTimestampType.NOT_CONFIGURED.value) code = self._conn.schemaless_insert(lines2_5, TDSmlProtocolType.TELNET.value, TDSmlTimestampType.NOT_CONFIGURED.value)
...@@ -190,16 +186,16 @@ class TDTestCase: ...@@ -190,16 +186,16 @@ class TDTestCase:
#bool #bool
lines2_6 = [ lines2_6 = [
"stb2_6 1626006833610ms t host=\"host0\"", "stb2_6 1626006833610 t host=\"host0\"",
"stb2_6 1626006833620ms T host=\"host0\"", "stb2_6 1626006833620 T host=\"host0\"",
"stb2_6 1626006833630ms true host=\"host0\"", "stb2_6 1626006833630 true host=\"host0\"",
"stb2_6 1626006833640ms True host=\"host0\"", "stb2_6 1626006833640 True host=\"host0\"",
"stb2_6 1626006833650ms TRUE host=\"host0\"", "stb2_6 1626006833650 TRUE host=\"host0\"",
"stb2_6 1626006833660ms f host=\"host0\"", "stb2_6 1626006833660 f host=\"host0\"",
"stb2_6 1626006833670ms F host=\"host0\"", "stb2_6 1626006833670 F host=\"host0\"",
"stb2_6 1626006833680ms false host=\"host0\"", "stb2_6 1626006833680 false host=\"host0\"",
"stb2_6 1626006833690ms False host=\"host0\"", "stb2_6 1626006833690 False host=\"host0\"",
"stb2_6 1626006833700ms FALSE host=\"host0\"" "stb2_6 1626006833700 FALSE host=\"host0\""
] ]
code = self._conn.schemaless_insert(lines2_6, TDSmlProtocolType.TELNET.value, TDSmlTimestampType.NOT_CONFIGURED.value) code = self._conn.schemaless_insert(lines2_6, TDSmlProtocolType.TELNET.value, TDSmlTimestampType.NOT_CONFIGURED.value)
...@@ -214,9 +210,9 @@ class TDTestCase: ...@@ -214,9 +210,9 @@ class TDTestCase:
#binary #binary
lines2_7 = [ lines2_7 = [
"stb2_7 1626006833610ms \" binary_val .!@#$%^&* \" host=\"host0\"", "stb2_7 1626006833610 \" binary_val .!@#$%^&* \" host=\"host0\"",
"stb2_7 1626006833620ms \"binary_val.:;,./?|+-=\" host=\"host0\"", "stb2_7 1626006833620 \"binary_val.:;,./?|+-=\" host=\"host0\"",
"stb2_7 1626006833630ms \"binary_val.()[]{}<>\" host=\"host0\"" "stb2_7 1626006833630 \"binary_val.()[]{}<>\" host=\"host0\""
] ]
code = self._conn.schemaless_insert(lines2_7, TDSmlProtocolType.TELNET.value, TDSmlTimestampType.NOT_CONFIGURED.value) code = self._conn.schemaless_insert(lines2_7, TDSmlProtocolType.TELNET.value, TDSmlTimestampType.NOT_CONFIGURED.value)
...@@ -231,8 +227,8 @@ class TDTestCase: ...@@ -231,8 +227,8 @@ class TDTestCase:
#nchar #nchar
lines2_8 = [ lines2_8 = [
"stb2_8 1626006833610ms L\" nchar_val 数值一 \" host=\"host0\"", "stb2_8 1626006833610 L\" nchar_val 数值一 \" host=\"host0\"",
"stb2_8 1626006833620ms L\"nchar_val数值二\" host=\"host0\"" "stb2_8 1626006833620 L\"nchar_val数值二\" host=\"host0\""
] ]
code = self._conn.schemaless_insert(lines2_8, TDSmlProtocolType.TELNET.value, TDSmlTimestampType.NOT_CONFIGURED.value) code = self._conn.schemaless_insert(lines2_8, TDSmlProtocolType.TELNET.value, TDSmlTimestampType.NOT_CONFIGURED.value)
...@@ -249,8 +245,8 @@ class TDTestCase: ...@@ -249,8 +245,8 @@ class TDTestCase:
print("============= step3 : test tags ================") print("============= step3 : test tags ================")
#tag value types #tag value types
lines3_0 = [ lines3_0 = [
"stb3_0 1626006833610ms 1 t1=127i8 t2=32767i16 t3=2147483647i32 t4=9223372036854775807i64 t5=3.4E38f32 t6=1.7E308f64 t7=true t8=\"binary_val_1\" t9=L\"标签值1\"", "stb3_0 1626006833610 1 t1=127i8 t2=32767i16 t3=2147483647i32 t4=9223372036854775807i64 t5=3.4E38f32 t6=1.7E308f64 t7=true t8=\"binary_val_1\" t9=L\"标签值1\"",
"stb3_0 1626006833610ms 2 t1=-127i8 t2=-32767i16 t3=-2147483647i32 t4=-9223372036854775807i64 t5=-3.4E38f32 t6=-1.7E308f64 t7=false t8=\"binary_val_2\" t9=L\"标签值2\"" "stb3_0 1626006833610 2 t1=-127i8 t2=-32767i16 t3=-2147483647i32 t4=-9223372036854775807i64 t5=-3.4E38f32 t6=-1.7E308f64 t7=false t8=\"binary_val_2\" t9=L\"标签值2\""
] ]
code = self._conn.schemaless_insert(lines3_0, TDSmlProtocolType.TELNET.value, TDSmlTimestampType.NOT_CONFIGURED.value) code = self._conn.schemaless_insert(lines3_0, TDSmlProtocolType.TELNET.value, TDSmlTimestampType.NOT_CONFIGURED.value)
...@@ -292,9 +288,9 @@ class TDTestCase: ...@@ -292,9 +288,9 @@ class TDTestCase:
#tag ID as child table name #tag ID as child table name
lines3_1 = [ lines3_1 = [
"stb3_1 1626006833610ms 1 id=child_table1 host=host1", "stb3_1 1626006833610 1 id=child_table1 host=host1",
"stb3_1 1626006833610ms 2 host=host2 iD=child_table2", "stb3_1 1626006833610 2 host=host2 iD=child_table2",
"stb3_1 1626006833610ms 3 ID=child_table3 host=host3" "stb3_1 1626006833610 3 ID=child_table3 host=host3"
] ]
code = self._conn.schemaless_insert(lines3_1, TDSmlProtocolType.TELNET.value, TDSmlTimestampType.NOT_CONFIGURED.value) code = self._conn.schemaless_insert(lines3_1, TDSmlProtocolType.TELNET.value, TDSmlTimestampType.NOT_CONFIGURED.value)
...@@ -308,6 +304,56 @@ class TDTestCase: ...@@ -308,6 +304,56 @@ class TDTestCase:
tdSql.checkData(0, 0, "child_table1") tdSql.checkData(0, 0, "child_table1")
### special characters and keywords ###
print("============= step4 : test special characters and keywords ================")
lines4_1 = [
"1234 1626006833610ms 1 id=123 456=true int=true double=false into=1 from=2 !@#$.%^&*()=false",
"int 1626006833610ms 2 id=and 456=true int=true double=false into=1 from=2 !@#$.%^&*()=false",
"double 1626006833610ms 2 id=for 456=true int=true double=false into=1 from=2 !@#$.%^&*()=false",
"from 1626006833610ms 2 id=!@#.^& 456=true int=true double=false into=1 from=2 !@#$.%^&*()=false",
"!@#$.%^&*() 1626006833610ms 2 id=none 456=true int=true double=false into=1 from=2 !@#$.%^&*()=false",
"STABLE 1626006833610ms 2 id=KEY 456=true int=true double=false TAG=1 FROM=2 COLUMN=false",
]
code = self._conn.schemaless_insert(lines4_1, TDSmlProtocolType.TELNET.value, TDSmlTimestampType.NOT_CONFIGURED.value)
print("schemaless_insert result {}".format(code))
tdSql.query('describe `1234`')
tdSql.checkRows(8)
tdSql.query('describe `int`')
tdSql.checkRows(8)
tdSql.query('describe `double`')
tdSql.checkRows(8)
tdSql.query('describe `from`')
tdSql.checkRows(8)
tdSql.query('describe `!@#$.%^&*()`')
tdSql.checkRows(8)
tdSql.query('describe `stable`')
tdSql.checkRows(8)
tdSql.query('select * from `123`')
tdSql.checkRows(1)
tdSql.query('select * from `and`')
tdSql.checkRows(1)
tdSql.query('select * from `for`')
tdSql.checkRows(1)
tdSql.query('select * from `!@#.^&`')
tdSql.checkRows(1)
tdSql.query('select * from `none`')
tdSql.checkRows(1)
tdSql.query('select * from `key`')
tdSql.checkRows(1)
def stop(self): def stop(self):
tdSql.close() tdSql.close()
tdLog.success("%s successfully executed" % __file__) tdLog.success("%s successfully executed" % __file__)
......
...@@ -85,6 +85,53 @@ class TDTestCase: ...@@ -85,6 +85,53 @@ class TDTestCase:
tdSql.query('select tbname, * from childtable') tdSql.query('select tbname, * from childtable')
tdSql.checkRows(1) tdSql.checkRows(1)
###Special Character and keyss
self._conn.schemaless_insert([
"1234,id=3456,abc=4i64,def=3i64 123=3i64,int=2i64,bool=false,into=5f64,column=7u64,!@#$.%^&*()=false 1626006933641",
"int,id=and,123=4i64,smallint=5f64,double=5f64,of=3i64,key=L\"passitagin_stf\",!@#$.%^&*()=false abc=false 1626006933654",
"double,id=for,123=4i64,smallint=5f64,double=5f64,of=3i64,key=L\"passitagin_stf\",!@#$.%^&*()=false abc=false 1626006933664",
"from,id=!@#$.%^,123=4i64,smallint=5f64,double=5f64,of=3i64,key=L\"passitagin_stf\",!@#$.%^&*()=false abc=false 1626006933674",
"!@#$.%^&*(),id=none,123=4i64,smallint=5f64,double=5f64,of=3i64,key=L\"passitagin_stf\",!@#$.%^&*()=false abc=false 1626006933684",
"STABLE,id=CREATE,123=4i64,smallint=5f64,DOUBLE=5f64,of=3i64,key=L\"passitagin_stf\",!@#$.%^&*()=false SELECT=false 1626006933684",
], TDSmlProtocolType.LINE.value, TDSmlTimestampType.MILLI_SECOND.value)
tdSql.execute('reset query cache')
tdSql.query('describe `1234`')
tdSql.checkRows(9)
tdSql.query('describe `int`')
tdSql.checkRows(8)
tdSql.query('describe `double`')
tdSql.checkRows(8)
tdSql.query('describe `from`')
tdSql.checkRows(8)
tdSql.query('describe `!@#$.%^&*()`')
tdSql.checkRows(8)
tdSql.query('describe `stable`')
tdSql.checkRows(8)
tdSql.query('select * from `3456`')
tdSql.checkRows(1)
tdSql.query('select * from `and`')
tdSql.checkRows(1)
tdSql.query('select * from `for`')
tdSql.checkRows(1)
tdSql.query('select * from `!@#$.%^`')
tdSql.checkRows(1)
tdSql.query('select * from `none`')
tdSql.checkRows(1)
tdSql.query('select * from `create`')
tdSql.checkRows(1)
def stop(self): def stop(self):
tdSql.close() tdSql.close()
tdLog.success("%s successfully executed" % __file__) tdLog.success("%s successfully executed" % __file__)
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
"cache": 50, "cache": 50,
"blocks": 8, "blocks": 8,
"precision": "ms", "precision": "ms",
"keep": 365, "keep": 36500,
"minRows": 100, "minRows": 100,
"maxRows": 4096, "maxRows": 4096,
"comp":2, "comp":2,
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
"name": "stb0", "name": "stb0",
"child_table_exists":"no", "child_table_exists":"no",
"childtable_count": 60, "childtable_count": 60,
"childtable_prefix": "stb00_", "childtable_prefix": "stb00_",
"auto_create_table": "no", "auto_create_table": "no",
"batch_create_tbl_num": 20, "batch_create_tbl_num": 20,
"data_source": "rand", "data_source": "rand",
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
"cache": 50, "cache": 50,
"blocks": 8, "blocks": 8,
"precision": "ms", "precision": "ms",
"keep": 36, "keep": 36500,
"minRows": 100, "minRows": 100,
"maxRows": 4096, "maxRows": 4096,
"comp":2, "comp":2,
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
"cache": 50, "cache": 50,
"blocks": 8, "blocks": 8,
"precision": "ns", "precision": "ns",
"keep": 36, "keep": 36500,
"minRows": 100, "minRows": 100,
"maxRows": 4096, "maxRows": 4096,
"comp":2, "comp":2,
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
"cache": 50, "cache": 50,
"blocks": 8, "blocks": 8,
"precision": "us", "precision": "us",
"keep": 36, "keep": 36500,
"minRows": 100, "minRows": 100,
"maxRows": 4096, "maxRows": 4096,
"comp":2, "comp":2,
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
"cache": 50, "cache": 50,
"blocks": 8, "blocks": 8,
"precision": "ns", "precision": "ns",
"keep": 36, "keep": 36500,
"minRows": 100, "minRows": 100,
"maxRows": 4096, "maxRows": 4096,
"comp":2, "comp":2,
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
"cache": 50, "cache": 50,
"blocks": 8, "blocks": 8,
"precision": "ns", "precision": "ns",
"keep": 36, "keep": 36500,
"minRows": 100, "minRows": 100,
"maxRows": 4096, "maxRows": 4096,
"comp":2, "comp":2,
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
"cache": 50, "cache": 50,
"blocks": 8, "blocks": 8,
"precision": "ns", "precision": "ns",
"keep": 36, "keep": 36500,
"minRows": 100, "minRows": 100,
"maxRows": 4096, "maxRows": 4096,
"comp":2, "comp":2,
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
"cache": 50, "cache": 50,
"blocks": 8, "blocks": 8,
"precision": "ns", "precision": "ns",
"keep": 36, "keep": 36500,
"minRows": 100, "minRows": 100,
"maxRows": 4096, "maxRows": 4096,
"comp":2, "comp":2,
......
...@@ -20,14 +20,16 @@ from util.dnodes import * ...@@ -20,14 +20,16 @@ from util.dnodes import *
import time import time
from datetime import datetime from datetime import datetime
import ast import ast
import re
# from assertpy import assert_that # from assertpy import assert_that
import subprocess import subprocess
class TDTestCase: class TDTestCase:
def init(self, conn, logSql): def init(self, conn, logSql):
tdLog.debug("start to execute %s" % __file__) tdLog.debug("start to execute %s" % __file__)
tdSql.init(conn.cursor(), logSql) tdSql.init(conn.cursor(), logSql)
def getBuildPath(self): def getBuildPath(self):
selfPath = os.path.dirname(os.path.realpath(__file__)) selfPath = os.path.dirname(os.path.realpath(__file__))
...@@ -40,52 +42,54 @@ class TDTestCase: ...@@ -40,52 +42,54 @@ class TDTestCase:
if ("taosd" in files): if ("taosd" in files):
rootRealPath = os.path.dirname(os.path.realpath(root)) rootRealPath = os.path.dirname(os.path.realpath(root))
if ("packaging" not in rootRealPath): if ("packaging" not in rootRealPath):
buildPath = root[:len(root)-len("/build/bin")] buildPath = root[:len(root) - len("/build/bin")]
break break
return buildPath return buildPath
# 获取taosc接口查询的结果文件中的内容,返回每行数据,并断言数据的第一列内容。 # 获取taosc接口查询的结果文件中的内容,返回每行数据,并断言数据的第一列内容。
def assertfileDataTaosc(self,filename,expectResult): def assertfileDataTaosc(self, filename, expectResult):
self.filename = filename self.filename = filename
self.expectResult = expectResult self.expectResult = expectResult
with open("%s" % filename, 'r+') as f1: with open("%s" % filename, 'r+') as f1:
for line in f1.readlines(): for line in f1.readlines():
queryResult = line.strip().split()[0] queryResult = line.strip().split()[0]
self.assertCheck(filename,queryResult,expectResult) self.assertCheck(filename, queryResult, expectResult)
# 获取restful接口查询的结果文件中的关键内容,目前的关键内容找到第一个key就跳出循,所以就只有一个数据。后续再修改多个结果文件。 # 获取restful接口查询的结果文件中的关键内容,目前的关键内容找到第一个key就跳出循,所以就只有一个数据。后续再修改多个结果文件。
def getfileDataRestful(self,filename): def getfileDataRestful(self, filename):
self.filename = filename self.filename = filename
with open("%s" % filename, 'r+') as f1: with open("%s" % filename, 'r+') as f1:
for line in f1.readlines(): for line in f1.readlines():
contents = line.strip() contents = line.strip()
if contents.find("data") != -1: if contents.find("data") != -1:
pattern = re.compile("{.*}")
contents = pattern.search(contents).group()
contentsDict = ast.literal_eval(contents) # 字符串转换为字典 contentsDict = ast.literal_eval(contents) # 字符串转换为字典
queryResult = contentsDict['data'][0][0] queryResult = contentsDict['data'][0][0]
break break
return queryResult return queryResult
# 获取taosc接口查询次数 # 获取taosc接口查询次数
def queryTimesTaosc(self,filename): def queryTimesTaosc(self, filename):
self.filename = filename self.filename = filename
command = 'cat %s |wc -l'% filename command = 'cat %s |wc -l' % filename
times = int(subprocess.getstatusoutput(command)[1]) times = int(subprocess.getstatusoutput(command)[1])
return times return times
# 获取restful接口查询次数 # 获取restful接口查询次数
def queryTimesRestful(self,filename): def queryTimesRestful(self, filename):
self.filename = filename self.filename = filename
command = 'cat %s |grep "200 OK" |wc -l'% filename command = 'cat %s |grep "200 OK" |wc -l' % filename
times = int(subprocess.getstatusoutput(command)[1]) times = int(subprocess.getstatusoutput(command)[1])
return times return times
# 定义断言结果是否正确。不正确返回错误结果,正确即通过。 # 定义断言结果是否正确。不正确返回错误结果,正确即通过。
def assertCheck(self,filename,queryResult,expectResult): def assertCheck(self, filename, queryResult, expectResult):
self.filename = filename self.filename = filename
self.queryResult = queryResult self.queryResult = queryResult
self.expectResult = expectResult self.expectResult = expectResult
args0 = (filename, queryResult, expectResult) args0 = (filename, queryResult, expectResult)
assert queryResult == expectResult , "Queryfile:%s ,result is %s != expect: %s" % args0 assert queryResult == expectResult, "Queryfile:%s ,result is %s != expect: %s" % args0
def run(self): def run(self):
buildPath = self.getBuildPath() buildPath = self.getBuildPath()
...@@ -93,109 +97,144 @@ class TDTestCase: ...@@ -93,109 +97,144 @@ class TDTestCase:
tdLog.exit("taosd not found!") tdLog.exit("taosd not found!")
else: else:
tdLog.info("taosd found in %s" % buildPath) tdLog.info("taosd found in %s" % buildPath)
binPath = buildPath+ "/build/bin/" binPath = buildPath + "/build/bin/"
# delete useless files # delete useless files
os.system("rm -rf ./query_res*") os.system("rm -rf ./query_res*")
os.system("rm -rf ./all_query*") os.system("rm -rf ./all_query*")
# taosc query: query specified table and query super table # taosc query: query specified table and query super table
os.system("%staosdemo -f tools/taosdemoAllTest/queryInsertdata.json" % binPath) os.system(
os.system("%staosdemo -f tools/taosdemoAllTest/queryTaosc.json" % binPath) "%staosdemo -f tools/taosdemoAllTest/queryInsertdata.json" %
binPath)
os.system(
"%staosdemo -f tools/taosdemoAllTest/queryTaosc.json" %
binPath)
os.system("cat query_res0.txt* > all_query_res0_taosc.txt") os.system("cat query_res0.txt* > all_query_res0_taosc.txt")
os.system("cat query_res1.txt* > all_query_res1_taosc.txt") os.system("cat query_res1.txt* > all_query_res1_taosc.txt")
os.system("cat query_res2.txt* > all_query_res2_taosc.txt") os.system("cat query_res2.txt* > all_query_res2_taosc.txt")
# correct Times testcases # correct Times testcases
queryTimes0Taosc = self.queryTimesTaosc("all_query_res0_taosc.txt") queryTimes0Taosc = self.queryTimesTaosc("all_query_res0_taosc.txt")
self.assertCheck("all_query_res0_taosc.txt",queryTimes0Taosc,6) self.assertCheck("all_query_res0_taosc.txt", queryTimes0Taosc, 6)
queryTimes1Taosc = self.queryTimesTaosc("all_query_res1_taosc.txt") queryTimes1Taosc = self.queryTimesTaosc("all_query_res1_taosc.txt")
self.assertCheck("all_query_res1_taosc.txt",queryTimes1Taosc,6) self.assertCheck("all_query_res1_taosc.txt", queryTimes1Taosc, 6)
queryTimes2Taosc = self.queryTimesTaosc("all_query_res2_taosc.txt") queryTimes2Taosc = self.queryTimesTaosc("all_query_res2_taosc.txt")
self.assertCheck("all_query_res2_taosc.txt",queryTimes2Taosc,20) self.assertCheck("all_query_res2_taosc.txt", queryTimes2Taosc, 20)
# correct data testcase # correct data testcase
self.assertfileDataTaosc("all_query_res0_taosc.txt","1604160000099") self.assertfileDataTaosc("all_query_res0_taosc.txt", "1604160000099")
self.assertfileDataTaosc("all_query_res1_taosc.txt","100") self.assertfileDataTaosc("all_query_res1_taosc.txt", "100")
self.assertfileDataTaosc("all_query_res2_taosc.txt","1604160000199") self.assertfileDataTaosc("all_query_res2_taosc.txt", "1604160000199")
# delete useless files # delete useless files
os.system("rm -rf ./query_res*") os.system("rm -rf ./query_res*")
os.system("rm -rf ./all_query*") os.system("rm -rf ./all_query*")
# use restful api to query # use restful api to query
os.system("%staosdemo -f tools/taosdemoAllTest/queryInsertrestdata.json" % binPath) os.system(
os.system("%staosdemo -f tools/taosdemoAllTest/queryRestful.json" % binPath) "%staosdemo -f tools/taosdemoAllTest/queryInsertrestdata.json" %
binPath)
os.system(
"%staosdemo -f tools/taosdemoAllTest/queryRestful.json" %
binPath)
os.system("cat query_res0.txt* > all_query_res0_rest.txt") os.system("cat query_res0.txt* > all_query_res0_rest.txt")
os.system("cat query_res1.txt* > all_query_res1_rest.txt") os.system("cat query_res1.txt* > all_query_res1_rest.txt")
os.system("cat query_res2.txt* > all_query_res2_rest.txt") os.system("cat query_res2.txt* > all_query_res2_rest.txt")
# correct Times testcases # correct Times testcases
queryTimes0Restful = self.queryTimesRestful("all_query_res0_rest.txt") queryTimes0Restful = self.queryTimesRestful("all_query_res0_rest.txt")
self.assertCheck("all_query_res0_rest.txt",queryTimes0Restful,6) self.assertCheck("all_query_res0_rest.txt", queryTimes0Restful, 6)
queryTimes1Restful = self.queryTimesRestful("all_query_res1_rest.txt") queryTimes1Restful = self.queryTimesRestful("all_query_res1_rest.txt")
self.assertCheck("all_query_res1_rest.txt",queryTimes1Restful,6) self.assertCheck("all_query_res1_rest.txt", queryTimes1Restful, 6)
queryTimes2Restful = self.queryTimesRestful("all_query_res2_rest.txt") queryTimes2Restful = self.queryTimesRestful("all_query_res2_rest.txt")
self.assertCheck("all_query_res2_rest.txt",queryTimes2Restful,4) self.assertCheck("all_query_res2_rest.txt", queryTimes2Restful, 4)
# correct data testcase # correct data testcase
data0 = self.getfileDataRestful("all_query_res0_rest.txt") data0 = self.getfileDataRestful("all_query_res0_rest.txt")
self.assertCheck('all_query_res0_rest.txt',data0,"2020-11-01 00:00:00.009") self.assertCheck(
'all_query_res0_rest.txt',
data0,
"2020-11-01 00:00:00.009")
data1 = self.getfileDataRestful("all_query_res1_rest.txt") data1 = self.getfileDataRestful("all_query_res1_rest.txt")
self.assertCheck('all_query_res1_rest.txt',data1,10) self.assertCheck('all_query_res1_rest.txt', data1, 10)
data2 = self.getfileDataRestful("all_query_res2_rest.txt") data2 = self.getfileDataRestful("all_query_res2_rest.txt")
self.assertCheck('all_query_res2_rest.txt',data2,"2020-11-01 00:00:00.004") self.assertCheck(
'all_query_res2_rest.txt',
data2,
"2020-11-01 00:00:00.004")
# query times less than or equal to 100 # query times less than or equal to 100
os.system("%staosdemo -f tools/taosdemoAllTest/queryInsertdata.json" % binPath) os.system(
os.system("%staosdemo -f tools/taosdemoAllTest/querySpeciMutisql100.json" % binPath) "%staosdemo -f tools/taosdemoAllTest/queryInsertdata.json" %
os.system("%staosdemo -f tools/taosdemoAllTest/querySuperMutisql100.json" % binPath) binPath)
os.system(
#query result print QPS "%staosdemo -f tools/taosdemoAllTest/querySpeciMutisql100.json" %
os.system("%staosdemo -f tools/taosdemoAllTest/queryInsertdata.json" % binPath) binPath)
os.system("%staosdemo -f tools/taosdemoAllTest/queryQps.json" % binPath) os.system(
"%staosdemo -f tools/taosdemoAllTest/querySuperMutisql100.json" %
binPath)
# query result print QPS
os.system(
"%staosdemo -f tools/taosdemoAllTest/queryInsertdata.json" %
binPath)
os.system(
"%staosdemo -f tools/taosdemoAllTest/queryQps.json" %
binPath)
# use illegal or out of range parameters query json file # use illegal or out of range parameters query json file
os.system("%staosdemo -f tools/taosdemoAllTest/queryInsertdata.json" % binPath) os.system(
exceptcode = os.system("%staosdemo -f tools/taosdemoAllTest/queryTimes0.json" % binPath) "%staosdemo -f tools/taosdemoAllTest/queryInsertdata.json" %
binPath)
exceptcode = os.system(
"%staosdemo -f tools/taosdemoAllTest/queryTimes0.json" %
binPath)
assert exceptcode != 0 assert exceptcode != 0
exceptcode0 = os.system("%staosdemo -f tools/taosdemoAllTest/queryTimesless0.json" % binPath) exceptcode0 = os.system(
"%staosdemo -f tools/taosdemoAllTest/queryTimesless0.json" %
binPath)
assert exceptcode0 != 0 assert exceptcode0 != 0
exceptcode1 = os.system("%staosdemo -f tools/taosdemoAllTest/queryConcurrentless0.json" % binPath) exceptcode1 = os.system(
"%staosdemo -f tools/taosdemoAllTest/queryConcurrentless0.json" %
binPath)
assert exceptcode1 != 0 assert exceptcode1 != 0
exceptcode2 = os.system("%staosdemo -f tools/taosdemoAllTest/queryConcurrent0.json" % binPath) exceptcode2 = os.system(
"%staosdemo -f tools/taosdemoAllTest/queryConcurrent0.json" %
binPath)
assert exceptcode2 != 0 assert exceptcode2 != 0
exceptcode3 = os.system("%staosdemo -f tools/taosdemoAllTest/querrThreadsless0.json" % binPath) exceptcode3 = os.system(
"%staosdemo -f tools/taosdemoAllTest/querrThreadsless0.json" %
binPath)
assert exceptcode3 != 0 assert exceptcode3 != 0
exceptcode4 = os.system("%staosdemo -f tools/taosdemoAllTest/querrThreads0.json" % binPath) exceptcode4 = os.system(
"%staosdemo -f tools/taosdemoAllTest/querrThreads0.json" %
binPath)
assert exceptcode4 != 0 assert exceptcode4 != 0
# delete useless files # delete useless files
os.system("rm -rf ./insert_res.txt") os.system("rm -rf ./insert_res.txt")
os.system("rm -rf tools/taosdemoAllTest/*.py.sql") os.system("rm -rf tools/taosdemoAllTest/*.py.sql")
os.system("rm -rf ./querySystemInfo*") os.system("rm -rf ./querySystemInfo*")
os.system("rm -rf ./query_res*") os.system("rm -rf ./query_res*")
os.system("rm -rf ./all_query*") # os.system("rm -rf ./all_query*")
os.system("rm -rf ./test_query_res0.txt") os.system("rm -rf ./test_query_res0.txt")
def stop(self): def stop(self):
tdSql.close() tdSql.close()
tdLog.success("%s successfully executed" % __file__) tdLog.success("%s successfully executed" % __file__)
tdCases.addWindows(__file__, TDTestCase()) tdCases.addWindows(__file__, TDTestCase())
tdCases.addLinux(__file__, TDTestCase()) tdCases.addLinux(__file__, TDTestCase())
...@@ -36,7 +36,7 @@ class TDTestCase: ...@@ -36,7 +36,7 @@ class TDTestCase:
if ("taosd" in files): if ("taosd" in files):
rootRealPath = os.path.dirname(os.path.realpath(root)) rootRealPath = os.path.dirname(os.path.realpath(root))
if ("packaging" not in rootRealPath): if ("packaging" not in rootRealPath):
buildPath = root[:len(root)-len("/build/bin")] buildPath = root[:len(root) - len("/build/bin")]
break break
return buildPath return buildPath
...@@ -46,14 +46,15 @@ class TDTestCase: ...@@ -46,14 +46,15 @@ class TDTestCase:
tdLog.exit("taosd not found!") tdLog.exit("taosd not found!")
else: else:
tdLog.info("taosd found in %s" % buildPath) tdLog.info("taosd found in %s" % buildPath)
binPath = buildPath+ "/build/bin/" binPath = buildPath + "/build/bin/"
# insert: create one or mutiple tables per sql and insert multiple rows per sql # insert: create one or mutiple tables per sql and insert multiple rows per sql
# insert data from a special timestamp # insert data from a special timestamp
# check stable stb0 # check stable stb0
os.system("%staosdemo -f tools/taosdemoAllTest/taosdemoTestNanoDatabase.json -y " % binPath) os.system(
"%staosdemo -f tools/taosdemoAllTest/taosdemoTestNanoDatabase.json -y " %
binPath)
tdSql.execute("use nsdb") tdSql.execute("use nsdb")
tdSql.query("show stables") tdSql.query("show stables")
tdSql.checkData(0, 4, 100) tdSql.checkData(0, 4, 100)
...@@ -64,9 +65,9 @@ class TDTestCase: ...@@ -64,9 +65,9 @@ class TDTestCase:
tdSql.query("select count(*) from stb0") tdSql.query("select count(*) from stb0")
tdSql.checkData(0, 0, 10000) tdSql.checkData(0, 0, 10000)
tdSql.query("describe stb0") tdSql.query("describe stb0")
tdSql.checkDataType(9, 1,"TIMESTAMP") tdSql.checkDataType(9, 1, "TIMESTAMP")
tdSql.query("select last(ts) from stb0") tdSql.query("select last(ts) from stb0")
tdSql.checkData(0, 0,"2021-07-01 00:00:00.990000000") tdSql.checkData(0, 0, "2021-07-01 00:00:00.990000000")
# check stable stb1 which is insert with disord # check stable stb1 which is insert with disord
...@@ -78,16 +79,18 @@ class TDTestCase: ...@@ -78,16 +79,18 @@ class TDTestCase:
tdSql.checkData(0, 0, 10000) tdSql.checkData(0, 0, 10000)
# check c8 is an nano timestamp # check c8 is an nano timestamp
tdSql.query("describe stb1") tdSql.query("describe stb1")
tdSql.checkDataType(9, 1,"TIMESTAMP") tdSql.checkDataType(9, 1, "TIMESTAMP")
# check insert timestamp_step is nano_second # check insert timestamp_step is nano_second
tdSql.query("select last(ts) from stb1") tdSql.query("select last(ts) from stb1")
tdSql.checkData(0, 0,"2021-07-01 00:00:00.990000000") tdSql.checkData(0, 0, "2021-07-01 00:00:00.990000000")
# insert data from now time # insert data from now time
# check stable stb0 # check stable stb0
os.system("%staosdemo -f tools/taosdemoAllTest/taosdemoTestNanoDatabaseNow.json -y " % binPath) os.system(
"%staosdemo -f tools/taosdemoAllTest/taosdemoTestNanoDatabaseNow.json -y " %
binPath)
tdSql.execute("use nsdb2") tdSql.execute("use nsdb2")
tdSql.query("show stables") tdSql.query("show stables")
tdSql.checkData(0, 4, 100) tdSql.checkData(0, 4, 100)
...@@ -99,11 +102,14 @@ class TDTestCase: ...@@ -99,11 +102,14 @@ class TDTestCase:
tdSql.checkData(0, 0, 10000) tdSql.checkData(0, 0, 10000)
# check c8 is an nano timestamp # check c8 is an nano timestamp
tdSql.query("describe stb0") tdSql.query("describe stb0")
tdSql.checkDataType(9,1,"TIMESTAMP") tdSql.checkDataType(9, 1, "TIMESTAMP")
# insert by csv files and timetamp is long int , strings in ts and
# cols
# insert by csv files and timetamp is long int , strings in ts and cols os.system(
"%staosdemo -f tools/taosdemoAllTest/taosdemoTestNanoDatabasecsv.json -y " %
os.system("%staosdemo -f tools/taosdemoAllTest/taosdemoTestNanoDatabasecsv.json -y " % binPath) binPath)
tdSql.execute("use nsdbcsv") tdSql.execute("use nsdbcsv")
tdSql.query("show stables") tdSql.query("show stables")
tdSql.checkData(0, 4, 100) tdSql.checkData(0, 4, 100)
...@@ -111,29 +117,36 @@ class TDTestCase: ...@@ -111,29 +117,36 @@ class TDTestCase:
tdSql.checkData(0, 0, 10000) tdSql.checkData(0, 0, 10000)
tdSql.query("describe stb0") tdSql.query("describe stb0")
tdSql.checkDataType(3, 1, "TIMESTAMP") tdSql.checkDataType(3, 1, "TIMESTAMP")
tdSql.query("select count(*) from stb0 where ts > \"2021-07-01 00:00:00.490000000\"") tdSql.query(
"select count(*) from stb0 where ts > \"2021-07-01 00:00:00.490000000\"")
tdSql.checkData(0, 0, 5000) tdSql.checkData(0, 0, 5000)
tdSql.query("select count(*) from stb0 where ts < 1626918583000000000") tdSql.query("select count(*) from stb0 where ts < 1626918583000000000")
tdSql.checkData(0, 0, 10000) tdSql.checkData(0, 0, 10000)
os.system("rm -rf ./insert_res.txt") os.system("rm -rf ./insert_res.txt")
os.system("rm -rf tools/taosdemoAllTest/taosdemoTestSupportNano*.py.sql") os.system("rm -rf tools/taosdemoAllTest/taosdemoTestSupportNano*.py.sql")
# taosdemo test insert with command and parameter , detals show taosdemo --help # taosdemo test insert with command and parameter , detals show
os.system("%staosdemo -u root -ptaosdata -P 6030 -a 1 -m pre -n 10 -T 20 -t 60 -o res.txt -y " % binPath) # taosdemo --help
os.system(
"%staosdemo -u root -ptaosdata -P 6030 -a 1 -m pre -n 10 -T 20 -t 60 -o res.txt -y " %
binPath)
tdSql.query("select count(*) from test.meters") tdSql.query("select count(*) from test.meters")
tdSql.checkData(0, 0, 600) tdSql.checkData(0, 0, 600)
# check taosdemo -s # check taosdemo -s
sqls_ls = ['drop database if exists nsdbsql;','create database nsdbsql precision "ns" keep 36 days 6 update 1;', sqls_ls = [
'use nsdbsql;','CREATE STABLE meters (ts timestamp, current float, voltage int, phase float) TAGS (location binary(64), groupdId int);', 'drop database if exists nsdbsql;',
'CREATE TABLE d1001 USING meters TAGS ("Beijing.Chaoyang", 2);', 'create database nsdbsql precision "ns" keep 36500 days 6 update 1;',
'INSERT INTO d1001 USING METERS TAGS ("Beijng.Chaoyang", 2) VALUES (now, 10.2, 219, 0.32);', 'use nsdbsql;',
'INSERT INTO d1001 USING METERS TAGS ("Beijng.Chaoyang", 2) VALUES (now, 85, 32, 0.76);'] 'CREATE STABLE meters (ts timestamp, current float, voltage int, phase float) TAGS (location binary(64), groupdId int);',
'CREATE TABLE d1001 USING meters TAGS ("Beijing.Chaoyang", 2);',
'INSERT INTO d1001 USING METERS TAGS ("Beijng.Chaoyang", 2) VALUES (now, 10.2, 219, 0.32);',
'INSERT INTO d1001 USING METERS TAGS ("Beijng.Chaoyang", 2) VALUES (now, 85, 32, 0.76);']
with open("./taosdemoTestNanoCreateDB.sql",mode ="a" ) as sql_files: with open("./taosdemoTestNanoCreateDB.sql", mode="a") as sql_files:
for sql in sqls_ls: for sql in sqls_ls:
sql_files.write(sql+"\n") sql_files.write(sql + "\n")
sql_files.close() sql_files.close()
sleep(10) sleep(10)
...@@ -141,11 +154,10 @@ class TDTestCase: ...@@ -141,11 +154,10 @@ class TDTestCase:
os.system("%staosdemo -s taosdemoTestNanoCreateDB.sql -y " % binPath) os.system("%staosdemo -s taosdemoTestNanoCreateDB.sql -y " % binPath)
tdSql.query("select count(*) from nsdbsql.meters") tdSql.query("select count(*) from nsdbsql.meters")
tdSql.checkData(0, 0, 2) tdSql.checkData(0, 0, 2)
os.system("rm -rf ./res.txt") os.system("rm -rf ./res.txt")
os.system("rm -rf ./*.py.sql") os.system("rm -rf ./*.py.sql")
os.system("rm -rf ./taosdemoTestNanoCreateDB.sql") os.system("rm -rf ./taosdemoTestNanoCreateDB.sql")
def stop(self): def stop(self):
tdSql.close() tdSql.close()
......
...@@ -22,9 +22,9 @@ void verify_telnet_insert(TAOS* taos) { ...@@ -22,9 +22,9 @@ void verify_telnet_insert(TAOS* taos) {
/* metric */ /* metric */
char* lines0[] = { char* lines0[] = {
"stb0_0 1626006833639000000ns 4i8 host=\"host0\" interface=\"eth0\"", "stb0_0 1626006833639 4i8 host=\"host0\" interface=\"eth0\"",
"stb0_1 1626006833639000000ns 4i8 host=\"host0\" interface=\"eth0\"", "stb0_1 1626006833639 4i8 host=\"host0\" interface=\"eth0\"",
"stb0_2 1626006833639000000ns 4i8 host=\"host0\" interface=\"eth0\"", "stb0_2 1626006833639 4i8 host=\"host0\" interface=\"eth0\"",
}; };
result = taos_schemaless_insert(taos, lines0, 3, TSDB_SML_TELNET_PROTOCOL, TSDB_SML_TIMESTAMP_NOT_CONFIGURED); result = taos_schemaless_insert(taos, lines0, 3, TSDB_SML_TELNET_PROTOCOL, TSDB_SML_TIMESTAMP_NOT_CONFIGURED);
code = taos_errno(result); code = taos_errno(result);
...@@ -35,15 +35,11 @@ void verify_telnet_insert(TAOS* taos) { ...@@ -35,15 +35,11 @@ void verify_telnet_insert(TAOS* taos) {
/* timestamp */ /* timestamp */
char* lines1[] = { char* lines1[] = {
"stb1 1626006833s 1i8 host=\"host0\"", "stb1 1626006833641 1i8 host=\"host0\"",
"stb1 1626006833639000000ns 2i8 host=\"host0\"", "stb1 1626006832 2i8 host=\"host0\"",
"stb1 1626006833640000us 3i8 host=\"host0\"", "stb1 0 3i8 host=\"host0\"",
"stb1 1626006833641 4i8 host=\"host0\"",
"stb1 1626006832 5i8 host=\"host0\"",
"stb1 1626006833651ms 6i8 host=\"host0\"",
"stb1 0 7i8 host=\"host0\"",
}; };
result = taos_schemaless_insert(taos, lines1, 7, TSDB_SML_TELNET_PROTOCOL, TSDB_SML_TIMESTAMP_NOT_CONFIGURED); result = taos_schemaless_insert(taos, lines1, 3, TSDB_SML_TELNET_PROTOCOL, TSDB_SML_TIMESTAMP_NOT_CONFIGURED);
code = taos_errno(result); code = taos_errno(result);
if (code) { if (code) {
printf("lines1 code: %d, %s.\n", code, tstrerror(code)); printf("lines1 code: %d, %s.\n", code, tstrerror(code));
...@@ -53,8 +49,8 @@ void verify_telnet_insert(TAOS* taos) { ...@@ -53,8 +49,8 @@ void verify_telnet_insert(TAOS* taos) {
/* metric value */ /* metric value */
//tinyint //tinyint
char* lines2_0[] = { char* lines2_0[] = {
"stb2_0 1626006833651ms -127i8 host=\"host0\"", "stb2_0 1626006833651 -127i8 host=\"host0\"",
"stb2_0 1626006833652ms 127i8 host=\"host0\"" "stb2_0 1626006833652 127i8 host=\"host0\""
}; };
result = taos_schemaless_insert(taos, lines2_0, 2, TSDB_SML_TELNET_PROTOCOL, TSDB_SML_TIMESTAMP_NOT_CONFIGURED); result = taos_schemaless_insert(taos, lines2_0, 2, TSDB_SML_TELNET_PROTOCOL, TSDB_SML_TIMESTAMP_NOT_CONFIGURED);
code = taos_errno(result); code = taos_errno(result);
...@@ -65,8 +61,8 @@ void verify_telnet_insert(TAOS* taos) { ...@@ -65,8 +61,8 @@ void verify_telnet_insert(TAOS* taos) {
//smallint //smallint
char* lines2_1[] = { char* lines2_1[] = {
"stb2_1 1626006833651ms -32767i16 host=\"host0\"", "stb2_1 1626006833651 -32767i16 host=\"host0\"",
"stb2_1 1626006833652ms 32767i16 host=\"host0\"" "stb2_1 1626006833652 32767i16 host=\"host0\""
}; };
result = taos_schemaless_insert(taos, lines2_1, 2, TSDB_SML_TELNET_PROTOCOL, TSDB_SML_TIMESTAMP_NOT_CONFIGURED); result = taos_schemaless_insert(taos, lines2_1, 2, TSDB_SML_TELNET_PROTOCOL, TSDB_SML_TIMESTAMP_NOT_CONFIGURED);
code = taos_errno(result); code = taos_errno(result);
...@@ -77,8 +73,8 @@ void verify_telnet_insert(TAOS* taos) { ...@@ -77,8 +73,8 @@ void verify_telnet_insert(TAOS* taos) {
//int //int
char* lines2_2[] = { char* lines2_2[] = {
"stb2_2 1626006833651ms -2147483647i32 host=\"host0\"", "stb2_2 1626006833651 -2147483647i32 host=\"host0\"",
"stb2_2 1626006833652ms 2147483647i32 host=\"host0\"" "stb2_2 1626006833652 2147483647i32 host=\"host0\""
}; };
result = taos_schemaless_insert(taos, lines2_2, 2, TSDB_SML_TELNET_PROTOCOL, TSDB_SML_TIMESTAMP_NOT_CONFIGURED); result = taos_schemaless_insert(taos, lines2_2, 2, TSDB_SML_TELNET_PROTOCOL, TSDB_SML_TIMESTAMP_NOT_CONFIGURED);
code = taos_errno(result); code = taos_errno(result);
...@@ -89,8 +85,8 @@ void verify_telnet_insert(TAOS* taos) { ...@@ -89,8 +85,8 @@ void verify_telnet_insert(TAOS* taos) {
//bigint //bigint
char* lines2_3[] = { char* lines2_3[] = {
"stb2_3 1626006833651ms -9223372036854775807i64 host=\"host0\"", "stb2_3 1626006833651 -9223372036854775807i64 host=\"host0\"",
"stb2_3 1626006833652ms 9223372036854775807i64 host=\"host0\"" "stb2_3 1626006833652 9223372036854775807i64 host=\"host0\""
}; };
result = taos_schemaless_insert(taos, lines2_3, 2, TSDB_SML_TELNET_PROTOCOL, TSDB_SML_TIMESTAMP_NOT_CONFIGURED); result = taos_schemaless_insert(taos, lines2_3, 2, TSDB_SML_TELNET_PROTOCOL, TSDB_SML_TIMESTAMP_NOT_CONFIGURED);
code = taos_errno(result); code = taos_errno(result);
...@@ -101,16 +97,16 @@ void verify_telnet_insert(TAOS* taos) { ...@@ -101,16 +97,16 @@ void verify_telnet_insert(TAOS* taos) {
//float //float
char* lines2_4[] = { char* lines2_4[] = {
"stb2_4 1626006833610ms 3f32 host=\"host0\"", "stb2_4 1626006833610 3f32 host=\"host0\"",
"stb2_4 1626006833620ms -3f32 host=\"host0\"", "stb2_4 1626006833620 -3f32 host=\"host0\"",
"stb2_4 1626006833630ms 3.4f32 host=\"host0\"", "stb2_4 1626006833630 3.4f32 host=\"host0\"",
"stb2_4 1626006833640ms -3.4f32 host=\"host0\"", "stb2_4 1626006833640 -3.4f32 host=\"host0\"",
"stb2_4 1626006833650ms 3.4E10f32 host=\"host0\"", "stb2_4 1626006833650 3.4E10f32 host=\"host0\"",
"stb2_4 1626006833660ms -3.4e10f32 host=\"host0\"", "stb2_4 1626006833660 -3.4e10f32 host=\"host0\"",
"stb2_4 1626006833670ms 3.4E+2f32 host=\"host0\"", "stb2_4 1626006833670 3.4E+2f32 host=\"host0\"",
"stb2_4 1626006833680ms -3.4e-2f32 host=\"host0\"", "stb2_4 1626006833680 -3.4e-2f32 host=\"host0\"",
"stb2_4 1626006833700ms 3.4E38f32 host=\"host0\"", "stb2_4 1626006833700 3.4E38f32 host=\"host0\"",
"stb2_4 1626006833710ms -3.4E38f32 host=\"host0\"" "stb2_4 1626006833710 -3.4E38f32 host=\"host0\""
}; };
result = taos_schemaless_insert(taos, lines2_4, 10, TSDB_SML_TELNET_PROTOCOL, TSDB_SML_TIMESTAMP_NOT_CONFIGURED); result = taos_schemaless_insert(taos, lines2_4, 10, TSDB_SML_TELNET_PROTOCOL, TSDB_SML_TIMESTAMP_NOT_CONFIGURED);
code = taos_errno(result); code = taos_errno(result);
...@@ -121,17 +117,17 @@ void verify_telnet_insert(TAOS* taos) { ...@@ -121,17 +117,17 @@ void verify_telnet_insert(TAOS* taos) {
//double //double
char* lines2_5[] = { char* lines2_5[] = {
"stb2_5 1626006833610ms 3f64 host=\"host0\"", "stb2_5 1626006833610 3f64 host=\"host0\"",
"stb2_5 1626006833620ms -3f64 host=\"host0\"", "stb2_5 1626006833620 -3f64 host=\"host0\"",
"stb2_5 1626006833630ms 3.4f64 host=\"host0\"", "stb2_5 1626006833630 3.4f64 host=\"host0\"",
"stb2_5 1626006833640ms -3.4f64 host=\"host0\"", "stb2_5 1626006833640 -3.4f64 host=\"host0\"",
"stb2_5 1626006833650ms 3.4E10f64 host=\"host0\"", "stb2_5 1626006833650 3.4E10f64 host=\"host0\"",
"stb2_5 1626006833660ms -3.4e10f64 host=\"host0\"", "stb2_5 1626006833660 -3.4e10f64 host=\"host0\"",
"stb2_5 1626006833670ms 3.4E+2f64 host=\"host0\"", "stb2_5 1626006833670 3.4E+2f64 host=\"host0\"",
"stb2_5 1626006833680ms -3.4e-2f64 host=\"host0\"", "stb2_5 1626006833680 -3.4e-2f64 host=\"host0\"",
"stb2_5 1626006833690ms 1.7E308f64 host=\"host0\"", "stb2_5 1626006833690 1.7E308f64 host=\"host0\"",
"stb2_5 1626006833700ms -1.7E308f64 host=\"host0\"", "stb2_5 1626006833700 -1.7E308f64 host=\"host0\"",
"stb2_5 1626006833710ms 3.15 host=\"host0\"" "stb2_5 1626006833710 3.15 host=\"host0\""
}; };
result = taos_schemaless_insert(taos, lines2_5, 11, TSDB_SML_TELNET_PROTOCOL, TSDB_SML_TIMESTAMP_NOT_CONFIGURED); result = taos_schemaless_insert(taos, lines2_5, 11, TSDB_SML_TELNET_PROTOCOL, TSDB_SML_TIMESTAMP_NOT_CONFIGURED);
code = taos_errno(result); code = taos_errno(result);
...@@ -142,16 +138,16 @@ void verify_telnet_insert(TAOS* taos) { ...@@ -142,16 +138,16 @@ void verify_telnet_insert(TAOS* taos) {
//bool //bool
char* lines2_6[] = { char* lines2_6[] = {
"stb2_6 1626006833610ms t host=\"host0\"", "stb2_6 1626006833610 t host=\"host0\"",
"stb2_6 1626006833620ms T host=\"host0\"", "stb2_6 1626006833620 T host=\"host0\"",
"stb2_6 1626006833630ms true host=\"host0\"", "stb2_6 1626006833630 true host=\"host0\"",
"stb2_6 1626006833640ms True host=\"host0\"", "stb2_6 1626006833640 True host=\"host0\"",
"stb2_6 1626006833650ms TRUE host=\"host0\"", "stb2_6 1626006833650 TRUE host=\"host0\"",
"stb2_6 1626006833660ms f host=\"host0\"", "stb2_6 1626006833660 f host=\"host0\"",
"stb2_6 1626006833670ms F host=\"host0\"", "stb2_6 1626006833670 F host=\"host0\"",
"stb2_6 1626006833680ms false host=\"host0\"", "stb2_6 1626006833680 false host=\"host0\"",
"stb2_6 1626006833690ms False host=\"host0\"", "stb2_6 1626006833690 False host=\"host0\"",
"stb2_6 1626006833700ms FALSE host=\"host0\"" "stb2_6 1626006833700 FALSE host=\"host0\""
}; };
result = taos_schemaless_insert(taos, lines2_6, 10, TSDB_SML_TELNET_PROTOCOL, TSDB_SML_TIMESTAMP_NOT_CONFIGURED); result = taos_schemaless_insert(taos, lines2_6, 10, TSDB_SML_TELNET_PROTOCOL, TSDB_SML_TIMESTAMP_NOT_CONFIGURED);
code = taos_errno(result); code = taos_errno(result);
...@@ -162,9 +158,9 @@ void verify_telnet_insert(TAOS* taos) { ...@@ -162,9 +158,9 @@ void verify_telnet_insert(TAOS* taos) {
//binary //binary
char* lines2_7[] = { char* lines2_7[] = {
"stb2_7 1626006833610ms \"binary_val.!@#$%^&*\" host=\"host0\"", "stb2_7 1626006833610 \"binary_val.!@#$%^&*\" host=\"host0\"",
"stb2_7 1626006833620ms \"binary_val.:;,./?|+-=\" host=\"host0\"", "stb2_7 1626006833620 \"binary_val.:;,./?|+-=\" host=\"host0\"",
"stb2_7 1626006833630ms \"binary_val.()[]{}<>\" host=\"host0\"" "stb2_7 1626006833630 \"binary_val.()[]{}<>\" host=\"host0\""
}; };
result = taos_schemaless_insert(taos, lines2_7, 3, TSDB_SML_TELNET_PROTOCOL, TSDB_SML_TIMESTAMP_NOT_CONFIGURED); result = taos_schemaless_insert(taos, lines2_7, 3, TSDB_SML_TELNET_PROTOCOL, TSDB_SML_TIMESTAMP_NOT_CONFIGURED);
code = taos_errno(result); code = taos_errno(result);
...@@ -175,8 +171,8 @@ void verify_telnet_insert(TAOS* taos) { ...@@ -175,8 +171,8 @@ void verify_telnet_insert(TAOS* taos) {
//nchar //nchar
char* lines2_8[] = { char* lines2_8[] = {
"stb2_8 1626006833610ms L\"nchar_val数值一\" host=\"host0\"", "stb2_8 1626006833610 L\"nchar_val数值一\" host=\"host0\"",
"stb2_8 1626006833620ms L\"nchar_val数值二\" host=\"host0\"" "stb2_8 1626006833620 L\"nchar_val数值二\" host=\"host0\""
}; };
result = taos_schemaless_insert(taos, lines2_8, 2, TSDB_SML_TELNET_PROTOCOL, TSDB_SML_TIMESTAMP_NOT_CONFIGURED); result = taos_schemaless_insert(taos, lines2_8, 2, TSDB_SML_TELNET_PROTOCOL, TSDB_SML_TIMESTAMP_NOT_CONFIGURED);
code = taos_errno(result); code = taos_errno(result);
...@@ -188,8 +184,8 @@ void verify_telnet_insert(TAOS* taos) { ...@@ -188,8 +184,8 @@ void verify_telnet_insert(TAOS* taos) {
/* tags */ /* tags */
//tag value types //tag value types
char* lines3_0[] = { char* lines3_0[] = {
"stb3_0 1626006833610ms 1 t1=127i8 t2=32767i16 t3=2147483647i32 t4=9223372036854775807i64 t5=3.4E38f32 t6=1.7E308f64 t7=true t8=\"binary_val_1\" t9=L\"标签值1\"", "stb3_0 1626006833610 1 t1=127i8 t2=32767i16 t3=2147483647i32 t4=9223372036854775807i64 t5=3.4E38f32 t6=1.7E308f64 t7=true t8=\"binary_val_1\" t9=L\"标签值1\"",
"stb3_0 1626006833610ms 2 t1=-127i8 t2=-32767i16 t3=-2147483647i32 t4=-9223372036854775807i64 t5=-3.4E38f32 t6=-1.7E308f64 t7=false t8=\"binary_val_2\" t9=L\"标签值2\"" "stb3_0 1626006833610 2 t1=-127i8 t2=-32767i16 t3=-2147483647i32 t4=-9223372036854775807i64 t5=-3.4E38f32 t6=-1.7E308f64 t7=false t8=\"binary_val_2\" t9=L\"标签值2\""
}; };
result = taos_schemaless_insert(taos, lines3_0, 2, TSDB_SML_TELNET_PROTOCOL, TSDB_SML_TIMESTAMP_NOT_CONFIGURED); result = taos_schemaless_insert(taos, lines3_0, 2, TSDB_SML_TELNET_PROTOCOL, TSDB_SML_TIMESTAMP_NOT_CONFIGURED);
code = taos_errno(result); code = taos_errno(result);
...@@ -200,9 +196,9 @@ void verify_telnet_insert(TAOS* taos) { ...@@ -200,9 +196,9 @@ void verify_telnet_insert(TAOS* taos) {
//tag ID as child table name //tag ID as child table name
char* lines3_1[] = { char* lines3_1[] = {
"stb3_1 1626006833610ms 1 id=child_table1 host=host1", "stb3_1 1626006833610 1 id=child_table1 host=host1",
"stb3_1 1626006833610ms 2 host=host2 iD=child_table2", "stb3_1 1626006833610 2 host=host2 iD=child_table2",
"stb3_1 1626006833610ms 3 ID=child_table3 host=host3" "stb3_1 1626006833610 3 ID=child_table3 host=host3"
}; };
result = taos_schemaless_insert(taos, lines3_1, 3, TSDB_SML_TELNET_PROTOCOL, TSDB_SML_TIMESTAMP_NOT_CONFIGURED); result = taos_schemaless_insert(taos, lines3_1, 3, TSDB_SML_TELNET_PROTOCOL, TSDB_SML_TIMESTAMP_NOT_CONFIGURED);
code = taos_errno(result); code = taos_errno(result);
......
...@@ -229,4 +229,6 @@ run general/db/show_create_table.sim ...@@ -229,4 +229,6 @@ run general/db/show_create_table.sim
run general/parser/like.sim run general/parser/like.sim
run general/parser/regex.sim run general/parser/regex.sim
run general/parser/tbname_escape.sim run general/parser/tbname_escape.sim
run general/parser/columnName_escape.sim
run general/parser/tagName_escape.sim
run general/parser/interp_blocks.sim run general/parser/interp_blocks.sim
system sh/stop_dnodes.sh
system sh/deploy.sh -n dnode1 -i 1
system sh/cfg.sh -n dnode1 -c walLevel -v 1
system sh/exec.sh -n dnode1 -s start
sleep 100
sql connect
print ======================== dnode1 start
sql create database colesc;
sql use colesc;
print ======================= test create table/stable
sql create table tb0 (ts timestamp, `123` int, `123 456` int, `123.abc` int)
sql create table tb1 (ts timestamp, `!%^&*()` int)
sql create table tb2 (ts timestamp, `int` int, `bool` int, `double` int, `INTO` int, `COLUMN` int)
sql create table stb0 (ts timestamp, `123` int, `123 456` int, `123.abc` int) tags (t1 int)
sql create table stb1 (ts timestamp, `!%^&*()` int) tags (t2 int)
sql create table stb2 (ts timestamp, `int` int, `bool` int, `double` int, `INTO` int, `COLUMN` int) tags (t3 int)
sql create table ctb0 using stb0 tags (1)
sql create table ctb1 using stb1 tags (1)
sql create table ctb2 using stb2 tags (1)
##check table
sql describe tb0;
if $rows != 4 then
return -1
endi
if $data10 != @123@ then
return -1
endi
if $data20 != @123 456@ then
return -1
endi
if $data30 != @123.abc@ then
return -1
endi
sql describe tb1;
if $rows != 2 then
return -1
endi
if $data10 != @!%^&*()@ then
return -1
endi
sql describe tb2;
if $rows != 6 then
return -1
endi
if $data10 != @int@ then
return -1
endi
if $data20 != @bool@ then
return -1
endi
if $data30 != @double@ then
return -1
endi
if $data40 != @INTO@ then
return -1
endi
if $data50 != @COLUMN@ then
return -1
endi
##check stable
sql describe stb0;
if $rows != 5 then
return -1
endi
if $data10 != @123@ then
return -1
endi
if $data20 != @123 456@ then
return -1
endi
if $data30 != @123.abc@ then
return -1
endi
sql describe stb1;
if $rows != 3 then
return -1
endi
if $data10 != @!%^&*()@ then
return -1
endi
sql describe stb2;
if $rows != 7 then
return -1
endi
if $data10 != @int@ then
return -1
endi
if $data20 != @bool@ then
return -1
endi
if $data30 != @double@ then
return -1
endi
if $data40 != @INTO@ then
return -1
endi
if $data50 != @COLUMN@ then
return -1
endi
print ======================= test Alter columns for table/stable
##Add column
sql_error alter table tb0 add column `123` int
sql_error alter table tb0 add column `123 456` int
sql_error alter table tb0 add column `123.abc` int
sql_error alter table ctb0 add column `1234`
sql alter table tb0 add column `!%^&*()` int
sql alter table tb0 add column `int` int
sql alter table tb0 add column `bool` int
sql alter table tb0 add column `double` int
sql alter table tb0 add column `INTO` nchar(10)
sql alter table tb0 add column `COLUMN` binary(10)
sql alter table stb0 add column `!%^&*()` int
sql alter table stb0 add column `int` int
sql alter table stb0 add column `bool` int
sql alter table stb0 add column `double` int
sql alter table stb0 add column `INTO` nchar(10)
sql alter table stb0 add column `COLUMN` binary(10)
##check table
sql describe tb0;
if $rows != 10 then
return -1
endi
if $data40 != @!%^&*()@ then
return -1
endi
if $data50 != @int@ then
return -1
endi
if $data60 != @bool@ then
return -1
endi
if $data70 != @double@ then
return -1
endi
if $data80 != @INTO@ then
return -1
endi
if $data90 != @COLUMN@ then
return -1
endi
#check stable
sql describe stb0;
if $rows != 11 then
return -1
endi
if $data40 != @!%^&*()@ then
return -1
endi
if $data50 != @int@ then
return -1
endi
if $data60 != @bool@ then
return -1
endi
if $data70 != @double@ then
return -1
endi
if $data80 != @INTO@ then
return -1
endi
if $data90 != @COLUMN@ then
return -1
endi
##Drop column
sql_error alter table ctb0 drop column `123`
sql_error alter table ctb0 drop column `123 456`
sql_error alter table ctb0 drop column `123.abc`
sql alter table tb0 drop column `!%^&*()`
sql alter table tb0 drop column `int`
sql alter table tb0 drop column `bool`
sql alter table tb0 drop column `double`
sql alter table tb0 drop column `INTO`
sql alter table tb0 drop column `COLUMN`
sql alter table stb0 drop column `!%^&*()`
sql alter table stb0 drop column `int`
sql alter table stb0 drop column `bool`
sql alter table stb0 drop column `double`
sql alter table stb0 drop column `INTO`
sql alter table stb0 drop column `COLUMN`
##check table
sql describe tb0;
if $rows != 4 then
return -1
endi
if $data10 != @123@ then
return -1
endi
if $data20 != @123 456@ then
return -1
endi
if $data30 != @123.abc@ then
return -1
endi
##check stable
sql describe stb0;
if $rows != 5 then
return -1
endi
if $data10 != @123@ then
return -1
endi
if $data20 != @123 456@ then
return -1
endi
if $data30 != @123.abc@ then
return -1
endi
##Modify column for binary/nchar length
sql alter table tb0 add column `INTO` nchar(10)
sql alter table tb0 add column `COLUMN` binary(10)
sql alter table stb0 add column `INTO` nchar(10)
sql alter table stb0 add column `COLUMN` binary(10)
sql alter table tb0 modify column `INTO` nchar(15)
sql alter table tb0 modify column `COLUMN` binary(15)
sql alter table stb0 modify column `INTO` nchar(15)
sql alter table stb0 modify column `COLUMN` binary(15)
sql describe tb0;
if $rows != 6 then
return -1
endi
if $data42 != @15@ then
return -1
endi
if $data52 != @15@ then
return -1
endi
sql describe stb0;
if $rows != 7 then
return -1
endi
if $data42 != @15@ then
return -1
endi
if $data52 != @15@ then
return -1
endi
print ======================= test insert columns for table/stable
sql insert into tb0 (ts, `123`, `123 456`, `123.abc`) values (now, 1, 1, 1)
sql insert into tb1 (ts, `!%^&*()`) values (now, 1)
sql insert into tb2 (ts, `int`, `bool`, `double`, `INTO`, `COLUMN`) values (now, 1, 1, 1, 1, 1)
sql insert into ctb0 (ts, `123`, `123 456`, `123.abc`) values (now, 1, 1, 1)
sql insert into ctb1 (ts, `!%^&*()`) values (now, 1)
sql insert into ctb2 (ts, `int`, `bool`, `double`, `INTO`, `COLUMN`) values (now, 1, 1, 1, 1, 1)
sql select * from tb0;
if $rows != 1 then
return -1
endi
sql select * from tb1;
if $rows != 1 then
return -1
endi
sql select * from tb2;
if $rows != 1 then
return -1
endi
sql select * from ctb0;
if $rows != 1 then
return -1
endi
sql select * from ctb1;
if $rows != 1 then
return -1
endi
sql select * from ctb2;
if $rows != 1 then
return -1
endi
print ======================= test select columns for table/stable
sql select `123`,`123 456`,`123.abc` from tb0;
if $rows != 1 then
return -1
endi
if $data00 != 1 then
return -1
endi
if $data01 != 1 then
return -1
endi
if $data02 != 1 then
return -1
endi
sql select `!%^&*()` from tb1;
if $rows != 1 then
return -1
endi
if $data00 != 1 then
return -1
endi
sql select `int`,`bool`,`double`,`INTO`,`COLUMN` from tb2;
if $rows != 1 then
return -1
endi
if $data00 != 1 then
return -1
endi
if $data01 != 1 then
return -1
endi
if $data02 != 1 then
return -1
endi
if $data03 != 1 then
return -1
endi
if $data04 != 1 then
return -1
endi
sql select `123`,`123 456`,`123.abc` from stb0;
if $rows != 1 then
return -1
endi
if $data00 != 1 then
return -1
endi
if $data01 != 1 then
return -1
endi
if $data02 != 1 then
return -1
endi
sql select `!%^&*()` from stb1;
if $rows != 1 then
return -1
endi
if $data00 != 1 then
return -1
endi
sql select `int`,`bool`,`double`,`INTO`,`COLUMN` from stb2;
if $rows != 1 then
return -1
endi
if $data00 != 1 then
return -1
endi
if $data01 != 1 then
return -1
endi
if $data02 != 1 then
return -1
endi
if $data03 != 1 then
return -1
endi
if $data04 != 1 then
return -1
endi
system sh/exec.sh -n dnode1 -s stop -x SIGINT
system sh/stop_dnodes.sh
system sh/deploy.sh -n dnode1 -i 1
system sh/cfg.sh -n dnode1 -c walLevel -v 1
system sh/exec.sh -n dnode1 -s start
sleep 100
sql connect
print ======================== dnode1 start
sql create database tagesc;
sql use tagesc;
print ======================= test create table/stable
sql create stable stb0 (ts timestamp, c0 int) tags (`123` int, `123 456` int, `123.abc` int)
sql create stable stb1 (ts timestamp, c1 int) tags (`!%^&*()` int)
sql create stable stb2 (ts timestamp, c2 int) tags (`int` int, `bool` int, `double` int, `INTO` int, `COLUMN` int)
sql create table ctb0 using stb0 (`123`, `123 456`, `123.abc`) tags (1, 1, 1)
sql create table ctb1 using stb1 (`!%^&*()`) tags (1)
sql create table ctb2 using stb2 (`int`, `bool`, `double`, `INTO`, `COLUMN`) tags (1, 1, 1, 1, 1)
##check table
sql describe ctb0;
if $rows != 5 then
return -1
endi
if $data20 != @123@ then
return -1
endi
if $data30 != @123 456@ then
return -1
endi
if $data40 != @123.abc@ then
return -1
endi
sql describe ctb1;
if $rows != 3 then
return -1
endi
if $data20 != @!%^&*()@ then
return -1
endi
sql describe ctb2;
if $rows != 7 then
return -1
endi
if $data20 != @int@ then
return -1
endi
if $data30 != @bool@ then
return -1
endi
if $data40 != @double@ then
return -1
endi
if $data50 != @INTO@ then
return -1
endi
if $data60 != @COLUMN@ then
return -1
endi
print ======================= test Alter tags for stable
##ADD TAG
sql_error alter stable stb0 add tag `123` int
sql_error alter stable stb0 add tag `123 456` int
sql_error alter stable stb0 add tag `123.abc` int
sql alter stable stb0 add tag `!%^&*()` int
sql alter stable stb0 add tag `int` int
sql alter stable stb0 add tag `bool` int
sql alter stable stb0 add tag `double` int
sql alter stable stb0 add tag `INTO` int
sql alter stable stb0 add tag `COLUMN` int
sql describe stb0;
if $rows != 11 then
return -1
endi
if $data50 != @!%^&*()@ then
return -1
endi
if $data60 != @int@ then
return -1
endi
if $data70 != @bool@ then
return -1
endi
if $data80 != @double@ then
return -1
endi
if $data90 != @INTO@ then
return -1
endi
##DROP TAG
sql alter stable stb0 drop tag `!%^&*()`
sql alter stable stb0 drop tag `int`
sql alter stable stb0 drop tag `bool`
sql alter stable stb0 drop tag `double`
sql alter stable stb0 drop tag `INTO`
sql alter stable stb0 drop tag `COLUMN`
sql describe stb0;
if $rows != 5 then
return -1
endi
if $data20 != @123@ then
return -1
endi
if $data30 != @123 456@ then
return -1
endi
if $data40 != @123.abc@ then
return -1
endi
##CHANGE TAG
sql alter stable stb0 change tag `123` `321`
sql alter stable stb0 change tag `123 456` `456 123`
#sql alter stable stb0 change tag `123.abc` `abc.123`
#change tag has bug when using dot in tagname
sql describe stb0;
if $rows != 5 then
return -1
endi
if $data20 != @321@ then
return -1
endi
if $data30 != @456 123@ then
return -1
endi
##SET TAG
sql insert into ctb0 values (now, 1)
sql insert into ctb1 values (now, 1)
sql insert into ctb2 values (now, 1)
sql alter table ctb0 set tag `321`=2
sql alter table ctb0 set tag `456 123`=2
#sql alter table ctb0 set tag `abc.123`=2
#change tag has bug when using dot in tagname
print ======================= test insert specific tags automatically create table
sql alter table ctb0 set tag `321`=2
sql alter table ctb0 set tag `321`=2
sql insert into ctb0_0 using stb0 (`321`, `456 123`, `123.abc`) tags (1, 1, 1) values (now + 10s, 5)
sql insert into ctb1_0 using stb1 (`!%^&*()`) tags (1) values (now + 10s, 5)
sql insert into ctb2_0 using stb2 (`int`, `bool`, `double`, `INTO`, `COLUMN`) tags (1, 1, 1, 1, 1) values (now + 10s, 5)
sql insert into ctb2_1 using stb2 (`int`, `bool`, `INTO`, `COLUMN`) tags (1, 1, 1, 1) values (now + 10s, 5)
sql select * from stb0;
if $rows != 2 then
return -1
endi
sql select * from stb1;
if $rows != 2 then
return -1
endi
sql select * from stb2;
if $rows != 3 then
return -1
endi
if $data24 != NULL then
return -1
endi
system sh/exec.sh -n dnode1 -s stop -x SIGINT
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册