Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
慢慢CG
TDengine
提交
55757e16
T
TDengine
项目概览
慢慢CG
/
TDengine
与 Fork 源项目一致
Fork自
taosdata / TDengine
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
55757e16
编写于
6月 19, 2021
作者:
B
bryanchang0603
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'develop' into test/TD-4652
上级
23117de9
55fea530
变更
62
展开全部
隐藏空白更改
内联
并排
Showing
62 changed file
with
2816 addition
and
599 deletion
+2816
-599
packaging/check_package.sh
packaging/check_package.sh
+245
-0
src/balance/src/bnMain.c
src/balance/src/bnMain.c
+1
-0
src/client/inc/tscUtil.h
src/client/inc/tscUtil.h
+2
-0
src/client/jni/com_taosdata_jdbc_TSDBJNIConnector.h
src/client/jni/com_taosdata_jdbc_TSDBJNIConnector.h
+3
-3
src/client/src/TSDBJNIConnector.c
src/client/src/TSDBJNIConnector.c
+14
-4
src/client/src/tscPrepare.c
src/client/src/tscPrepare.c
+5
-5
src/client/src/tscSQLParser.c
src/client/src/tscSQLParser.c
+77
-76
src/client/src/tscSub.c
src/client/src/tscSub.c
+15
-9
src/client/src/tscSubquery.c
src/client/src/tscSubquery.c
+4
-4
src/client/src/tscUtil.c
src/client/src/tscUtil.c
+17
-0
src/connector/jdbc/CMakeLists.txt
src/connector/jdbc/CMakeLists.txt
+1
-1
src/connector/jdbc/pom.xml
src/connector/jdbc/pom.xml
+0
-1
src/connector/jdbc/src/main/java/com/taosdata/jdbc/AbstractConnection.java
...c/src/main/java/com/taosdata/jdbc/AbstractConnection.java
+3
-2
src/connector/jdbc/src/main/java/com/taosdata/jdbc/AbstractStatement.java
...bc/src/main/java/com/taosdata/jdbc/AbstractStatement.java
+0
-2
src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBError.java
...ector/jdbc/src/main/java/com/taosdata/jdbc/TSDBError.java
+1
-0
src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBErrorNumbers.java
...dbc/src/main/java/com/taosdata/jdbc/TSDBErrorNumbers.java
+2
-0
src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBJNIConnector.java
...dbc/src/main/java/com/taosdata/jdbc/TSDBJNIConnector.java
+10
-0
src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBPreparedStatement.java
...rc/main/java/com/taosdata/jdbc/TSDBPreparedStatement.java
+5
-39
src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBResultSetRowData.java
...src/main/java/com/taosdata/jdbc/TSDBResultSetRowData.java
+66
-39
src/connector/jdbc/src/main/java/com/taosdata/jdbc/enums/TimestampPrecision.java
...main/java/com/taosdata/jdbc/enums/TimestampPrecision.java
+8
-0
src/connector/jdbc/src/main/java/com/taosdata/jdbc/rs/RestfulPreparedStatement.java
...n/java/com/taosdata/jdbc/rs/RestfulPreparedStatement.java
+4
-17
src/connector/jdbc/src/main/java/com/taosdata/jdbc/rs/RestfulResultSet.java
.../src/main/java/com/taosdata/jdbc/rs/RestfulResultSet.java
+67
-40
src/connector/jdbc/src/main/java/com/taosdata/jdbc/rs/RestfulResultSetMetaData.java
...n/java/com/taosdata/jdbc/rs/RestfulResultSetMetaData.java
+5
-3
src/connector/jdbc/src/main/java/com/taosdata/jdbc/rs/enums/TimestampFormat.java
...main/java/com/taosdata/jdbc/rs/enums/TimestampFormat.java
+7
-0
src/connector/jdbc/src/main/java/com/taosdata/jdbc/utils/HttpClientPoolUtil.java
...main/java/com/taosdata/jdbc/utils/HttpClientPoolUtil.java
+3
-14
src/connector/jdbc/src/main/java/com/taosdata/jdbc/utils/Utils.java
...tor/jdbc/src/main/java/com/taosdata/jdbc/utils/Utils.java
+76
-28
src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBJNIConnectorTest.java
...src/test/java/com/taosdata/jdbc/TSDBJNIConnectorTest.java
+64
-7
src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBPreparedStatementTest.java
...est/java/com/taosdata/jdbc/TSDBPreparedStatementTest.java
+110
-108
src/connector/jdbc/src/test/java/com/taosdata/jdbc/cases/DoubleQuoteInSqlTest.java
...st/java/com/taosdata/jdbc/cases/DoubleQuoteInSqlTest.java
+32
-24
src/connector/jdbc/src/test/java/com/taosdata/jdbc/cases/MicroSecondPrecisionJNITest.java
.../com/taosdata/jdbc/cases/MicroSecondPrecisionJNITest.java
+1
-1
src/connector/jdbc/src/test/java/com/taosdata/jdbc/cases/MicroSecondPrecisionRestfulTest.java
.../taosdata/jdbc/cases/MicroSecondPrecisionRestfulTest.java
+1
-2
src/connector/jdbc/src/test/java/com/taosdata/jdbc/cases/NanoSecondTimestampJNITest.java
...a/com/taosdata/jdbc/cases/NanoSecondTimestampJNITest.java
+182
-0
src/connector/jdbc/src/test/java/com/taosdata/jdbc/cases/NanoSecondTimestampRestfulTest.java
...m/taosdata/jdbc/cases/NanoSecondTimestampRestfulTest.java
+182
-0
src/connector/jdbc/src/test/java/com/taosdata/jdbc/cases/NullValueInResultSetJNITest.java
.../com/taosdata/jdbc/cases/NullValueInResultSetJNITest.java
+1
-1
src/connector/jdbc/src/test/java/com/taosdata/jdbc/cases/NullValueInResultSetRestfulTest.java
.../taosdata/jdbc/cases/NullValueInResultSetRestfulTest.java
+1
-1
src/connector/jdbc/src/test/java/com/taosdata/jdbc/cases/NullValueInResultSetTest.java
...ava/com/taosdata/jdbc/cases/NullValueInResultSetTest.java
+1
-1
src/connector/jdbc/src/test/java/com/taosdata/jdbc/cases/PreparedStatementBatchInsertJNITest.java
...sdata/jdbc/cases/PreparedStatementBatchInsertJNITest.java
+98
-0
src/connector/jdbc/src/test/java/com/taosdata/jdbc/cases/PreparedStatementBatchInsertRestfulTest.java
...a/jdbc/cases/PreparedStatementBatchInsertRestfulTest.java
+98
-0
src/connector/jdbc/src/test/java/com/taosdata/jdbc/cases/ResultSetMetaShouldNotBeNullRestfulTest.java
...a/jdbc/cases/ResultSetMetaShouldNotBeNullRestfulTest.java
+86
-0
src/connector/jdbc/src/test/java/com/taosdata/jdbc/cases/TD4144Test.java
...dbc/src/test/java/com/taosdata/jdbc/cases/TD4144Test.java
+0
-105
src/connector/jdbc/src/test/java/com/taosdata/jdbc/utils/UtilsTest.java
...jdbc/src/test/java/com/taosdata/jdbc/utils/UtilsTest.java
+77
-1
src/connector/python/setup.py
src/connector/python/setup.py
+1
-1
src/connector/python/taos/cinterface.py
src/connector/python/taos/cinterface.py
+31
-23
src/connector/python/taos/constants.py
src/connector/python/taos/constants.py
+2
-0
src/dnode/inc/dnodeCfg.h
src/dnode/inc/dnodeCfg.h
+1
-0
src/dnode/src/dnodeCfg.c
src/dnode/src/dnodeCfg.c
+22
-0
src/dnode/src/dnodeVnodes.c
src/dnode/src/dnodeVnodes.c
+1
-0
src/query/inc/qTableMeta.h
src/query/inc/qTableMeta.h
+0
-1
src/query/inc/sql.y
src/query/inc/sql.y
+1
-1
src/query/src/qAggMain.c
src/query/src/qAggMain.c
+1
-10
src/query/src/qExecutor.c
src/query/src/qExecutor.c
+2
-0
src/tsdb/src/tsdbMain.c
src/tsdb/src/tsdbMain.c
+3
-0
src/tsdb/src/tsdbMeta.c
src/tsdb/src/tsdbMeta.c
+4
-1
src/tsdb/src/tsdbRead.c
src/tsdb/src/tsdbRead.c
+1
-1
tests/pytest/dbmgmt/nanoSecondCheck.py
tests/pytest/dbmgmt/nanoSecondCheck.py
+8
-7
tests/pytest/fulltest.sh
tests/pytest/fulltest.sh
+3
-0
tests/pytest/functions/function_derivative.py
tests/pytest/functions/function_derivative.py
+8
-1
tests/pytest/insert/in_function.py
tests/pytest/insert/in_function.py
+726
-0
tests/pytest/insert/modify_column.py
tests/pytest/insert/modify_column.py
+382
-0
tests/pytest/util/sql.py
tests/pytest/util/sql.py
+23
-15
tests/script/general/http/grafana_bug.sim
tests/script/general/http/grafana_bug.sim
+12
-0
tests/script/general/parser/function.sim
tests/script/general/parser/function.sim
+9
-0
未找到文件。
packaging/check_package.sh
0 → 100755
浏览文件 @
55757e16
#!/bin/bash
#
# This file is used to install database on linux systems. The operating system
# is required to use systemd to manage services at boot
set
-e
#set -x
verMode
=
edge
pagMode
=
full
iplist
=
""
serverFqdn
=
""
# -----------------------Variables definition---------------------
script_dir
=
"../release"
# Dynamic directory
data_dir
=
"/var/lib/taos"
log_dir
=
"/var/log/taos"
data_link_dir
=
"/usr/local/taos/data"
log_link_dir
=
"/usr/local/taos/log"
cfg_install_dir
=
"/etc/taos"
bin_link_dir
=
"/usr/bin"
lib_link_dir
=
"/usr/lib"
lib64_link_dir
=
"/usr/lib64"
inc_link_dir
=
"/usr/include"
#install main path
install_main_dir
=
"/usr/local/taos"
# old bin dir
sbin_dir
=
"/usr/local/taos/bin"
temp_version
=
""
fin_result
=
""
service_config_dir
=
"/etc/systemd/system"
nginx_port
=
6060
nginx_dir
=
"/usr/local/nginxd"
# Color setting
RED
=
'\033[0;31m'
GREEN
=
'\033[1;32m'
GREEN_DARK
=
'\033[0;32m'
GREEN_UNDERLINE
=
'\033[4;32m'
NC
=
'\033[0m'
csudo
=
""
if
command
-v
sudo
>
/dev/null
;
then
csudo
=
"sudo"
fi
# ============================= get input parameters =================================================
# install.sh -v [server | client] -e [yes | no] -i [systemd | service | ...]
# set parameters by default value
interactiveFqdn
=
yes
# [yes | no]
verType
=
server
# [server | client]
initType
=
systemd
# [systemd | service | ...]
while
getopts
"hv:d:"
arg
do
case
$arg
in
d
)
#echo "interactiveFqdn=$OPTARG"
script_dir
=
$(
echo
$OPTARG
)
;;
h
)
echo
"Usage:
`
basename
$0
`
-d scripy_path"
exit
0
;;
?
)
#unknow option
echo
"unkonw argument"
exit
1
;;
esac
done
#echo "verType=${verType} interactiveFqdn=${interactiveFqdn}"
function
kill_process
()
{
pid
=
$(
ps
-ef
|
grep
"
$1
"
|
grep
-v
"grep"
|
awk
'{print $2}'
)
if
[
-n
"
$pid
"
]
;
then
${
csudo
}
kill
-9
$pid
||
:
fi
}
function
check_file
()
{
#check file whether exists
if
[
!
-e
$1
/
$2
]
;
then
echo
-e
"
$1
/
$2
\0
33[31mnot exists
\0
33[0m!quit"
fin_result
=
$fin_result
"
\0
33[31m
$temp_version
\0
33[0m test failed!
\n
"
echo
-e
$fin_result
exit
8
fi
}
function
get_package_name
()
{
var
=
$1
if
[[
$1
=
~
'aarch'
]]
;
then
echo
${
var
::-21
}
else
echo
${
var
::-17
}
fi
}
function
check_link
()
{
#check Link whether exists or broken
if
[
-L
$1
]
;
then
if
[
!
-e
$1
]
;
then
echo
-e
"
$1
\0
33[31Broken link
\0
33[0m"
fin_result
=
$fin_result
"
\0
33[31m
$temp_version
\0
33[0m test failed!
\n
"
echo
-e
$fin_result
exit
8
fi
else
echo
-e
"
$1
\0
33[31mnot exists
\0
33[0m!quit"
fin_result
=
$fin_result
"
\0
33[31m
$temp_version
\0
33[0m test failed!
\n
"
echo
-e
$fin_result
exit
8
fi
}
function
check_main_path
()
{
#check install main dir and all sub dir
main_dir
=(
""
"cfg"
"bin"
"connector"
"driver"
"examples"
"include"
"init.d"
)
for
i
in
${
main_dir
[@]
}
;
do
check_file
${
install_main_dir
}
$i
done
if
[
"
$verMode
"
==
"cluster"
]
;
then
nginx_main_dir
=(
"admin"
"conf"
"html"
"sbin"
"logs"
)
for
i
in
${
nginx_main_dir
[@]
}
;
do
check_file
${
nginx_dir
}
$i
done
fi
echo
-e
"Check main path:
\0
33[32mOK
\0
33[0m!"
}
function
check_bin_path
()
{
# check install bin dir and all sub dir
bin_dir
=(
"taos"
"taosd"
"taosdemo"
"taosdump"
"remove.sh"
"tarbitrator"
"set_core.sh"
)
for
i
in
${
bin_dir
[@]
}
;
do
check_file
${
sbin_dir
}
$i
done
lbin_dir
=(
"taos"
"taosd"
"taosdemo"
"taosdump"
"rmtaos"
"tarbitrator"
"set_core"
)
for
i
in
${
lbin_dir
[@]
}
;
do
check_link
${
bin_link_dir
}
/
$i
done
if
[
"
$verMode
"
==
"cluster"
]
;
then
check_file
${
nginx_dir
}
/sbin nginx
fi
echo
-e
"Check bin path:
\0
33[32mOK
\0
33[0m!"
}
function
check_lib_path
()
{
# check all links
check_link
${
lib_link_dir
}
/libtaos.so
check_link
${
lib_link_dir
}
/libtaos.so.1
if
[[
-d
${
lib64_link_dir
}
]]
;
then
check_link
${
lib64_link_dir
}
/libtaos.so
check_link
${
lib64_link_dir
}
/libtaos.so.1
fi
echo
-e
"Check lib path:
\0
33[32mOK
\0
33[0m!"
}
function
check_header_path
()
{
# check all header
header_dir
=(
"taos.h"
"taoserror.h"
)
for
i
in
${
header_dir
[@]
}
;
do
check_link
${
inc_link_dir
}
/
$i
done
echo
-e
"Check bin path:
\0
33[32mOK
\0
33[0m!"
}
function
check_config_dir
()
{
# check all config
check_file
${
cfg_install_dir
}
taos.cfg
check_file
${
install_main_dir
}
/cfg taos.cfg.org
echo
-e
"Check conf path:
\0
33[32mOK
\0
33[0m!"
}
function
check_log_path
()
{
# check log path
check_file
${
log_dir
}
echo
-e
"Check log path:
\0
33[32mOK
\0
33[0m!"
}
function
check_data_path
()
{
# check data path
check_file
${
data_dir
}
echo
-e
"Check data path:
\0
33[32mOK
\0
33[0m!"
}
function
install_TDengine
()
{
cd
${
script_dir
}
tar
zxf
$1
temp_version
=
$(
get_package_name
$1
)
cd
$(
get_package_name
$1
)
echo
-e
"
\0
33[32muninstall TDengine && install TDengine...
\0
33[0m"
rmtaos
>
/dev/null 2>&1
||
echo
'taosd not installed'
&&
echo
-e
'\n\n'
|./install.sh
>
/dev/null 2>&1
echo
-e
"
\0
33[32mTDengine has been installed!
\0
33[0m"
echo
-e
"
\0
33[32mTDengine is starting...
\0
33[0m"
kill_process taos
&&
systemctl start taosd
&&
sleep
10
}
function
test_TDengine
()
{
check_main_path
check_bin_path
check_lib_path
check_header_path
check_config_dir
check_log_path
check_data_path
result
=
`
taos
-s
'create database test ;create table test.tt(ts timestamp ,i int);insert into test.tt values(now,11);select * from test.tt'
2>&1
||
:
`
if
[[
$result
=
~
"Unable to establish"
]]
;
then
echo
-e
"
\0
33[31mTDengine connect failed
\0
33[0m"
fin_result
=
$fin_result
"
\0
33[31m
$temp_version
\0
33[0m test failed!
\n
"
echo
-e
$fin_result
exit
8
fi
echo
-e
"Check TDengine connect:
\0
33[32mOK
\0
33[0m!"
fin_result
=
$fin_result
"
\0
33[32m
$temp_version
\0
33[0m test OK!
\n
"
}
# ## ==============================Main program starts from here============================
TD_package_name
=
`
ls
${
script_dir
}
/
*
server
*
gz |awk
-F
'/'
'{print $NF}'
`
temp
=
`
pwd
`
for
i
in
$TD_package_name
;
do
if
[[
$i
=
~
'enterprise'
]]
;
then
verMode
=
"cluster"
else
verMode
=
""
fi
cd
$temp
install_TDengine
$i
test_TDengine
done
echo
"============================================================"
echo
-e
$fin_result
\ No newline at end of file
src/balance/src/bnMain.c
浏览文件 @
55757e16
...
...
@@ -367,6 +367,7 @@ static bool bnMonitorBalance() {
for
(
int32_t
dest
=
0
;
dest
<
src
;
dest
++
)
{
SDnodeObj
*
pDestDnode
=
tsBnDnodes
.
list
[
dest
];
if
(
bnCheckDnodeInVgroup
(
pDestDnode
,
pVgroup
))
continue
;
if
(
taosGetTimestampMs
()
-
pDestDnode
->
createdTime
<
2000
)
continue
;
float
destScore
=
bnTryCalcDnodeScore
(
pDestDnode
,
1
);
if
(
srcScore
+
0
.
0001
<
destScore
)
continue
;
...
...
src/client/inc/tscUtil.h
浏览文件 @
55757e16
...
...
@@ -123,6 +123,8 @@ int32_t tscGetDataBlockFromList(SHashObj* pHashList, int64_t id, int32_t size, i
*/
bool
tscIsPointInterpQuery
(
SQueryInfo
*
pQueryInfo
);
bool
tscIsTWAQuery
(
SQueryInfo
*
pQueryInfo
);
bool
tscIsIrateQuery
(
SQueryInfo
*
pQueryInfo
);
bool
tscIsSessionWindowQuery
(
SQueryInfo
*
pQueryInfo
);
bool
tscIsSecondStageQuery
(
SQueryInfo
*
pQueryInfo
);
bool
tsIsArithmeticQueryOnAggResult
(
SQueryInfo
*
pQueryInfo
);
...
...
src/client/jni/com_taosdata_jdbc_TSDBJNIConnector.h
浏览文件 @
55757e16
...
...
@@ -51,10 +51,10 @@ JNIEXPORT jstring JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_getTsCharset
/*
* Class: com_taosdata_jdbc_TSDBJNIConnector
* Method: getResultTimePrecision
* Signature: (J
)J
* Method: getResultTimePrecision
Imp
* Signature: (J
J)I
*/
JNIEXPORT
jint
JNICALL
Java_com_taosdata_jdbc_TDDBJNIConnector_getResultTimePrecision
JNIEXPORT
jint
JNICALL
Java_com_taosdata_jdbc_TDDBJNIConnector_getResultTimePrecision
Imp
(
JNIEnv
*
,
jobject
,
jlong
,
jlong
);
/*
...
...
src/client/src/TSDBJNIConnector.c
浏览文件 @
55757e16
...
...
@@ -113,7 +113,7 @@ static void jniGetGlobalMethod(JNIEnv *env) {
g_rowdataSetFloatFp
=
(
*
env
)
->
GetMethodID
(
env
,
g_rowdataClass
,
"setFloat"
,
"(IF)V"
);
g_rowdataSetDoubleFp
=
(
*
env
)
->
GetMethodID
(
env
,
g_rowdataClass
,
"setDouble"
,
"(ID)V"
);
g_rowdataSetStringFp
=
(
*
env
)
->
GetMethodID
(
env
,
g_rowdataClass
,
"setString"
,
"(ILjava/lang/String;)V"
);
g_rowdataSetTimestampFp
=
(
*
env
)
->
GetMethodID
(
env
,
g_rowdataClass
,
"setTimestamp"
,
"(IJ)V"
);
g_rowdataSetTimestampFp
=
(
*
env
)
->
GetMethodID
(
env
,
g_rowdataClass
,
"setTimestamp"
,
"(IJ
I
)V"
);
g_rowdataSetByteArrayFp
=
(
*
env
)
->
GetMethodID
(
env
,
g_rowdataClass
,
"setByteArray"
,
"(I[B)V"
);
(
*
env
)
->
DeleteLocalRef
(
env
,
rowdataClass
);
...
...
@@ -519,9 +519,11 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_fetchRowImp(JNIEn
jniFromNCharToByteArray
(
env
,
(
char
*
)
row
[
i
],
length
[
i
]));
break
;
}
case
TSDB_DATA_TYPE_TIMESTAMP
:
(
*
env
)
->
CallVoidMethod
(
env
,
rowobj
,
g_rowdataSetTimestampFp
,
i
,
(
jlong
)
*
((
int64_t
*
)
row
[
i
]));
case
TSDB_DATA_TYPE_TIMESTAMP
:
{
int
precision
=
taos_result_precision
(
result
);
(
*
env
)
->
CallVoidMethod
(
env
,
rowobj
,
g_rowdataSetTimestampFp
,
i
,
(
jlong
)
*
((
int64_t
*
)
row
[
i
]),
precision
);
break
;
}
default:
break
;
}
...
...
@@ -672,7 +674,15 @@ JNIEXPORT jstring JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_getTsCharset(J
return
(
*
env
)
->
NewStringUTF
(
env
,
(
const
char
*
)
tsCharset
);
}
JNIEXPORT
jint
JNICALL
Java_com_taosdata_jdbc_TDDBJNIConnector_getResultTimePrecision
(
JNIEnv
*
env
,
jobject
jobj
,
jlong
con
,
/**
* Get Result Time Precision
* @param env vm
* @param jobj the TSDBJNIConnector java object
* @param con the c connection pointer
* @param res the TAOS_RES object, i.e. the SSqlObject
* @return precision 0:ms 1:us 2:ns
*/
JNIEXPORT
jint
JNICALL
Java_com_taosdata_jdbc_TSDBJNIConnector_getResultTimePrecisionImp
(
JNIEnv
*
env
,
jobject
jobj
,
jlong
con
,
jlong
res
)
{
TAOS
*
tscon
=
(
TAOS
*
)
con
;
if
(
tscon
==
NULL
)
{
...
...
src/client/src/tscPrepare.c
浏览文件 @
55757e16
...
...
@@ -906,7 +906,7 @@ static int insertStmtBindParam(STscStmt* stmt, TAOS_BIND* bind) {
int
code
=
doBindParam
(
pBlock
,
data
,
param
,
&
bind
[
param
->
idx
],
1
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
tscDebug
(
"0x%"
PRIx64
" bind column %d: type mismatch or invalid"
,
pStmt
->
pSql
->
self
,
param
->
idx
);
tscDebug
(
"0x%"
PRIx64
" bind column %d: type mismatch or invalid"
,
pStmt
->
pSql
->
self
,
param
->
idx
);
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
&
stmt
->
pSql
->
cmd
),
"bind column type mismatch or invalid"
);
}
}
...
...
@@ -1256,7 +1256,7 @@ int stmtParseInsertTbTags(SSqlObj* pSql, STscStmt* pStmt) {
return
TSDB_CODE_SUCCESS
;
}
if
(
sToken
.
n
<=
0
||
sToken
.
type
!=
TK_USING
)
{
if
(
sToken
.
n
<=
0
||
sToken
.
type
!=
TK_USING
)
{
tscError
(
"keywords USING is expected, sql:%s"
,
pCmd
->
insertParam
.
sql
);
return
tscSQLSyntaxErrMsg
(
pCmd
->
payload
,
"keywords USING is expected"
,
sToken
.
z
?
sToken
.
z
:
pCmd
->
insertParam
.
sql
);
}
...
...
@@ -1403,7 +1403,7 @@ int stmtGenInsertStatement(SSqlObj* pSql, STscStmt* pStmt, const char* name, TAO
}
else
{
tfree
(
pSql
->
sqlstr
);
}
pSql
->
sqlstr
=
str
;
return
TSDB_CODE_SUCCESS
;
...
...
@@ -1415,7 +1415,7 @@ int stmtGenInsertStatement(SSqlObj* pSql, STscStmt* pStmt, const char* name, TAO
TAOS_STMT
*
taos_stmt_init
(
TAOS
*
taos
)
{
STscObj
*
pObj
=
(
STscObj
*
)
taos
;
STscStmt
*
pStmt
=
NULL
;
if
(
pObj
==
NULL
||
pObj
->
signature
!=
pObj
)
{
terrno
=
TSDB_CODE_TSC_DISCONNECTED
;
tscError
(
"connection disconnected"
);
...
...
@@ -1469,7 +1469,7 @@ int taos_stmt_prepare(TAOS_STMT* stmt, const char* sql, unsigned long length) {
tscError
(
"sql is NULL"
);
STMT_RET
(
invalidOperationMsg
(
tscGetErrorMsgPayload
(
&
pStmt
->
pSql
->
cmd
),
"sql is NULL"
));
}
if
(
pStmt
->
last
!=
STMT_INIT
)
{
tscError
(
"prepare status error, last:%d"
,
pStmt
->
last
);
STMT_RET
(
invalidOperationMsg
(
tscGetErrorMsgPayload
(
&
pStmt
->
pSql
->
cmd
),
"prepare status error"
));
...
...
src/client/src/tscSQLParser.c
浏览文件 @
55757e16
...
...
@@ -147,57 +147,57 @@ int16_t getNewResColId(SSqlCmd* pCmd) {
return
pCmd
->
resColumnId
--
;
}
// serialize expr in exprlist to binary
// serialize expr in exprlist to binary
// formate "type | size | value"
bool
serializeExprListToVariant
(
SArray
*
pList
,
tVariant
**
dst
,
int16_t
colType
)
{
bool
ret
=
false
;
if
(
!
pList
||
pList
->
size
<=
0
||
colType
<
0
)
{
return
ret
;
}
tSqlExprItem
*
item
=
(
tSqlExprItem
*
)
taosArrayGet
(
pList
,
0
);
int32_t
firstTokenType
=
item
->
pNode
->
token
.
type
;
}
tSqlExprItem
*
item
=
(
tSqlExprItem
*
)
taosArrayGet
(
pList
,
0
);
int32_t
firstTokenType
=
item
->
pNode
->
token
.
type
;
int32_t
type
=
firstTokenType
;
//nchar to binary and
toTSDBType
(
type
);
//nchar to binary and
toTSDBType
(
type
);
if
(
type
!=
colType
&&
(
type
!=
TSDB_DATA_TYPE_BINARY
||
colType
!=
TSDB_DATA_TYPE_NCHAR
))
{
return
false
;
}
type
=
colType
;
return
false
;
}
type
=
colType
;
SBufferWriter
bw
=
tbufInitWriter
(
NULL
,
false
);
tbufEnsureCapacity
(
&
bw
,
512
);
int32_t
size
=
(
int32_t
)(
pList
->
size
);
tbufWriteUint32
(
&
bw
,
type
);
tbufWriteUint32
(
&
bw
,
type
);
tbufWriteInt32
(
&
bw
,
size
);
for
(
int32_t
i
=
0
;
i
<
size
;
i
++
)
{
tSqlExpr
*
pSub
=
((
tSqlExprItem
*
)(
taosArrayGet
(
pList
,
i
)))
->
pNode
;
// check all the token type in expr list same or not
if
(
firstTokenType
!=
pSub
->
token
.
type
)
{
break
;
}
}
toTSDBType
(
pSub
->
token
.
type
);
toTSDBType
(
pSub
->
token
.
type
);
tVariant
var
;
tVariantCreate
(
&
var
,
&
pSub
->
token
);
if
(
type
==
TSDB_DATA_TYPE_BOOL
||
type
==
TSDB_DATA_TYPE_TINYINT
||
type
==
TSDB_DATA_TYPE_SMALLINT
tVariant
var
;
tVariantCreate
(
&
var
,
&
pSub
->
token
);
if
(
type
==
TSDB_DATA_TYPE_BOOL
||
type
==
TSDB_DATA_TYPE_TINYINT
||
type
==
TSDB_DATA_TYPE_SMALLINT
||
type
==
TSDB_DATA_TYPE_BIGINT
||
type
==
TSDB_DATA_TYPE_INT
)
{
tbufWriteInt64
(
&
bw
,
var
.
i64
);
tbufWriteInt64
(
&
bw
,
var
.
i64
);
}
else
if
(
type
==
TSDB_DATA_TYPE_DOUBLE
||
type
==
TSDB_DATA_TYPE_FLOAT
)
{
tbufWriteDouble
(
&
bw
,
var
.
dKey
);
}
else
if
(
type
==
TSDB_DATA_TYPE_BINARY
){
tbufWriteBinary
(
&
bw
,
var
.
pz
,
var
.
nLen
);
}
else
if
(
type
==
TSDB_DATA_TYPE_NCHAR
)
{
char
*
buf
=
(
char
*
)
calloc
(
1
,
(
var
.
nLen
+
1
)
*
TSDB_NCHAR_SIZE
);
char
*
buf
=
(
char
*
)
calloc
(
1
,
(
var
.
nLen
+
1
)
*
TSDB_NCHAR_SIZE
);
if
(
tVariantDump
(
&
var
,
buf
,
type
,
false
)
!=
TSDB_CODE_SUCCESS
)
{
free
(
buf
);
tVariantDestroy
(
&
var
);
break
;
break
;
}
tbufWriteBinary
(
&
bw
,
buf
,
twcslen
((
wchar_t
*
)
buf
)
*
TSDB_NCHAR_SIZE
);
free
(
buf
);
...
...
@@ -209,21 +209,21 @@ bool serializeExprListToVariant(SArray* pList, tVariant **dst, int16_t colType)
if
(
ret
==
true
)
{
if
((
*
dst
=
calloc
(
1
,
sizeof
(
tVariant
)))
!=
NULL
)
{
tVariantCreateFromBinary
(
*
dst
,
tbufGetData
(
&
bw
,
false
),
tbufTell
(
&
bw
),
TSDB_DATA_TYPE_BINARY
);
tVariantCreateFromBinary
(
*
dst
,
tbufGetData
(
&
bw
,
false
),
tbufTell
(
&
bw
),
TSDB_DATA_TYPE_BINARY
);
}
else
{
ret
=
false
;
}
}
tbufCloseWriter
(
&
bw
);
tbufCloseWriter
(
&
bw
);
return
ret
;
}
static
int32_t
validateParamOfRelationIn
(
tVariant
*
pVar
,
int32_t
colType
)
{
if
(
pVar
->
nType
!=
TSDB_DATA_TYPE_BINARY
)
{
return
-
1
;
return
-
1
;
}
SBufferReader
br
=
tbufInitReader
(
pVar
->
pz
,
pVar
->
nLen
,
false
);
return
colType
==
TSDB_DATA_TYPE_NCHAR
?
0
:
(
tbufReadUint32
(
&
br
)
==
colType
?
0
:
-
1
);
SBufferReader
br
=
tbufInitReader
(
pVar
->
pz
,
pVar
->
nLen
,
false
);
return
colType
==
TSDB_DATA_TYPE_NCHAR
?
0
:
(
tbufReadUint32
(
&
br
)
==
colType
?
0
:
-
1
);
}
static
uint8_t
convertOptr
(
SStrToken
*
pToken
)
{
...
...
@@ -423,18 +423,6 @@ int32_t tscValidateSqlInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) {
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
return
code
;
}
if
(
pInfo
->
pMiscInfo
->
tableType
==
TSDB_SUPER_TABLE
)
{
//// code = tscGetTableMeta(pSql, pTableMetaInfo);
//// if (code != TSDB_CODE_SUCCESS) {
//// return code;
//// }
//
// if (!UTIL_TABLE_IS_SUPER_TABLE(pTableMetaInfo)) {
// return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg4);
// }
}
}
else
if
(
pInfo
->
type
==
TSDB_SQL_DROP_DNODE
)
{
if
(
pzName
->
type
==
TK_STRING
)
{
pzName
->
n
=
strdequote
(
pzName
->
z
);
...
...
@@ -507,7 +495,7 @@ int32_t tscValidateSqlInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) {
break
;
}
case
TSDB_SQL_CREATE_DNODE
:
{
const
char
*
msg
=
"invalid host name (ip address)"
;
...
...
@@ -772,6 +760,11 @@ int32_t tscValidateSqlInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) {
pCmd
->
active
=
pCmd
->
pQueryInfo
;
pCmd
->
command
=
pCmd
->
pQueryInfo
->
command
;
STableMetaInfo
*
pTableMetaInfo1
=
tscGetMetaInfo
(
pCmd
->
active
,
0
);
if
(
pTableMetaInfo1
->
pTableMeta
!=
NULL
)
{
pSql
->
res
.
precision
=
tscGetTableInfo
(
pTableMetaInfo1
->
pTableMeta
).
precision
;
}
return
TSDB_CODE_SUCCESS
;
// do not build query message here
}
...
...
@@ -803,12 +796,12 @@ int32_t tscValidateSqlInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) {
}
break
;
}
case
TSDB_SQL_COMPACT_VNODE
:{
case
TSDB_SQL_COMPACT_VNODE
:{
const
char
*
msg
=
"invalid compact"
;
if
(
setCompactVnodeInfo
(
pSql
,
pInfo
)
!=
TSDB_CODE_SUCCESS
)
{
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg
);
}
break
;
}
break
;
}
default:
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
"not support sql expression"
);
...
...
@@ -956,20 +949,22 @@ int32_t validateIntervalNode(SSqlObj* pSql, SQueryInfo* pQueryInfo, SSqlNode* pS
static
int32_t
validateStateWindowNode
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
SSqlNode
*
pSqlNode
,
bool
isStable
)
{
const
char
*
msg1
=
"invalid column name"
;
const
char
*
msg2
=
"invalid column type"
;
const
char
*
msg3
=
"not support state_window with group by "
;
const
char
*
msg4
=
"function not support for super table query"
;
const
char
*
msg5
=
"not support state_window on tag column"
;
SStrToken
*
col
=
&
(
pSqlNode
->
windowstateVal
.
col
)
;
if
(
col
->
z
==
NULL
||
col
->
n
<=
0
)
{
return
TSDB_CODE_SUCCESS
;
}
return
TSDB_CODE_SUCCESS
;
}
if
(
pQueryInfo
->
colList
==
NULL
)
{
pQueryInfo
->
colList
=
taosArrayInit
(
4
,
POINTER_BYTES
);
}
if
(
pQueryInfo
->
groupbyExpr
.
numOfGroupCols
>
0
)
{
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg3
);
}
}
pQueryInfo
->
groupbyExpr
.
numOfGroupCols
=
1
;
//TODO(dengyihao): check tag column
...
...
@@ -980,23 +975,27 @@ static int32_t validateStateWindowNode(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SS
SColumnIndex
index
=
COLUMN_INDEX_INITIALIZER
;
if
(
getColumnIndexByName
(
pCmd
,
col
,
pQueryInfo
,
&
index
)
!=
TSDB_CODE_SUCCESS
)
{
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg1
);
}
}
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
index
.
tableIndex
);
STableMeta
*
pTableMeta
=
pTableMetaInfo
->
pTableMeta
;
int32_t
numOfCols
=
tscGetNumOfColumns
(
pTableMeta
);
if
(
index
.
columnIndex
==
TSDB_TBNAME_COLUMN_INDEX
||
index
.
columnIndex
>=
numOfCols
)
{
if
(
index
.
columnIndex
==
TSDB_TBNAME_COLUMN_INDEX
)
{
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg3
);
}
else
if
(
index
.
columnIndex
>=
numOfCols
)
{
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg5
);
}
SGroupbyExpr
*
pGroupExpr
=
&
pQueryInfo
->
groupbyExpr
;
if
(
pGroupExpr
->
columnInfo
==
NULL
)
{
pGroupExpr
->
columnInfo
=
taosArrayInit
(
4
,
sizeof
(
SColIndex
));
}
SSchema
*
pSchema
=
tscGetTableColumnSchema
(
pTableMeta
,
index
.
columnIndex
);
if
(
pSchema
->
type
==
TSDB_DATA_TYPE_TIMESTAMP
||
pSchema
->
type
==
TSDB_DATA_TYPE_FLOAT
||
pSchema
->
type
==
TSDB_DATA_TYPE_DOUBLE
)
{
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg1
);
if
(
pSchema
->
type
==
TSDB_DATA_TYPE_TIMESTAMP
||
pSchema
->
type
==
TSDB_DATA_TYPE_FLOAT
||
pSchema
->
type
==
TSDB_DATA_TYPE_DOUBLE
||
pSchema
->
type
==
TSDB_DATA_TYPE_NCHAR
||
pSchema
->
type
==
TSDB_DATA_TYPE_BINARY
)
{
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg2
);
}
tscColumnListInsert
(
pQueryInfo
->
colList
,
index
.
columnIndex
,
pTableMeta
->
id
.
uid
,
pSchema
);
...
...
@@ -1045,7 +1044,7 @@ int32_t validateSessionNode(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SSqlNode * pS
}
if
(
index
.
columnIndex
!=
PRIMARYKEY_TIMESTAMP_COL_INDEX
)
{
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg3
);
}
}
pQueryInfo
->
sessionWindow
.
primaryColId
=
PRIMARYKEY_TIMESTAMP_COL_INDEX
;
...
...
@@ -2022,8 +2021,10 @@ int32_t addProjectionExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, t
if
(
index
.
columnIndex
==
TSDB_TBNAME_COLUMN_INDEX
)
{
SSchema
colSchema
=
*
tGetTbnameColumnSchema
();
getColumnName
(
pItem
,
colSchema
.
name
,
colSchema
.
name
,
sizeof
(
colSchema
.
name
)
-
1
);
char
name
[
TSDB_COL_NAME_LEN
]
=
{
0
};
getColumnName
(
pItem
,
name
,
colSchema
.
name
,
sizeof
(
colSchema
.
name
)
-
1
);
tstrncpy
(
colSchema
.
name
,
name
,
TSDB_COL_NAME_LEN
);
/*SExprInfo* pExpr = */
tscAddFuncInSelectClause
(
pQueryInfo
,
startPos
,
TSDB_FUNC_TAGPRJ
,
&
index
,
&
colSchema
,
TSDB_COL_TAG
,
getNewResColId
(
pCmd
));
}
else
{
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
index
.
tableIndex
);
...
...
@@ -2337,7 +2338,7 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
tickPerSec
/=
1000000
;
}
else
if
(
info
.
precision
==
TSDB_TIME_PRECISION_MICRO
)
{
tickPerSec
/=
1000
;
}
}
if
(
tickPerSec
<=
0
||
tickPerSec
<
TSDB_TICK_PER_SECOND
(
info
.
precision
))
{
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg10
);
...
...
@@ -2974,7 +2975,7 @@ int32_t setKillInfo(SSqlObj* pSql, struct SSqlInfo* pInfo, int32_t killType) {
static
int32_t
setCompactVnodeInfo
(
SSqlObj
*
pSql
,
struct
SSqlInfo
*
pInfo
)
{
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
pCmd
->
command
=
pInfo
->
type
;
return
TSDB_CODE_SUCCESS
;
}
bool
validateIpAddress
(
const
char
*
ip
,
size_t
size
)
{
...
...
@@ -3062,8 +3063,8 @@ void tscRestoreFuncForSTableQuery(SQueryInfo* pQueryInfo) {
}
bool
hasUnsupportFunctionsForSTableQuery
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
)
{
const
char
*
msg1
=
"TWA/Diff not allowed to apply to super table directly"
;
const
char
*
msg2
=
"TWA/Diff only support group by tbname for super table query"
;
const
char
*
msg1
=
"TWA/Diff
/Derivative/Irate
not allowed to apply to super table directly"
;
const
char
*
msg2
=
"TWA/Diff
/Derivative/Irate
only support group by tbname for super table query"
;
const
char
*
msg3
=
"function not support for super table query"
;
// filter sql function not supported by metric query yet.
...
...
@@ -3076,7 +3077,7 @@ bool hasUnsupportFunctionsForSTableQuery(SSqlCmd* pCmd, SQueryInfo* pQueryInfo)
}
}
if
(
tscIsTWAQuery
(
pQueryInfo
)
||
tscIsDiffDerivQuery
(
pQueryInfo
))
{
if
(
tscIsTWAQuery
(
pQueryInfo
)
||
tscIsDiffDerivQuery
(
pQueryInfo
)
||
tscIsIrateQuery
(
pQueryInfo
)
)
{
if
(
pQueryInfo
->
groupbyExpr
.
numOfGroupCols
==
0
)
{
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg1
);
return
true
;
...
...
@@ -3094,7 +3095,7 @@ bool hasUnsupportFunctionsForSTableQuery(SSqlCmd* pCmd, SQueryInfo* pQueryInfo)
}
}
else
if
(
tscIsSessionWindowQuery
(
pQueryInfo
))
{
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg3
);
return
true
;
return
true
;
}
return
false
;
...
...
@@ -3336,24 +3337,24 @@ static int32_t doExtractColumnFilterInfo(SSqlCmd* pCmd, SQueryInfo* pQueryInfo,
// TK_GT,TK_GE,TK_EQ,TK_NE are based on the pColumn->lowerBndd
}
else
if
(
pExpr
->
tokenId
==
TK_IN
)
{
tVariant
*
pVal
;
tVariant
*
pVal
;
if
(
pRight
->
tokenId
!=
TK_SET
||
!
serializeExprListToVariant
(
pRight
->
pParam
,
&
pVal
,
colType
)
||
colType
==
TSDB_DATA_TYPE_TIMESTAMP
)
{
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg
);
}
}
if
(
validateParamOfRelationIn
(
pVal
,
colType
)
!=
TSDB_CODE_SUCCESS
)
{
tVariantDestroy
(
pVal
);
tVariantDestroy
(
pVal
);
free
(
pVal
);
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg
);
}
pColumnFilter
->
pz
=
(
int64_t
)
calloc
(
1
,
pVal
->
nLen
+
1
);
pColumnFilter
->
len
=
pVal
->
nLen
;
pColumnFilter
->
filterstr
=
1
;
memcpy
((
char
*
)(
pColumnFilter
->
pz
),
(
char
*
)(
pVal
->
pz
),
pVal
->
nLen
);
memcpy
((
char
*
)(
pColumnFilter
->
pz
),
(
char
*
)(
pVal
->
pz
),
pVal
->
nLen
);
//retVal = tVariantDump(pVal, (char *)(pColumnFilter->pz), TSDB_DATA_TYPE_BINARY, false);
tVariantDestroy
(
pVal
);
tVariantDestroy
(
pVal
);
free
(
pVal
);
}
else
if
(
colType
==
TSDB_DATA_TYPE_BINARY
)
{
pColumnFilter
->
pz
=
(
int64_t
)
calloc
(
1
,
bufLen
*
TSDB_NCHAR_SIZE
);
pColumnFilter
->
len
=
pRight
->
value
.
nLen
;
...
...
@@ -4880,7 +4881,7 @@ int32_t getTimeRange(STimeWindow* win, tSqlExpr* pRight, int32_t optr, int16_t t
if
(
pRight
->
flags
&
(
1
<<
EXPR_FLAG_NS_TIMESTAMP
))
{
pRight
->
value
.
i64
=
convertTimePrecision
(
pRight
->
value
.
i64
,
TSDB_TIME_PRECISION_NANO
,
timePrecision
);
}
tVariantDump
(
&
pRight
->
value
,
(
char
*
)
&
val
,
TSDB_DATA_TYPE_BIGINT
,
true
);
}
...
...
@@ -5538,7 +5539,7 @@ int32_t setAlterTableInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) {
if
(
pItem
->
type
!=
TSDB_DATA_TYPE_BINARY
&&
pItem
->
type
!=
TSDB_DATA_TYPE_NCHAR
)
{
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg21
);
}
SColumnIndex
columnIndex
=
COLUMN_INDEX_INITIALIZER
;
SStrToken
name
=
{.
type
=
TK_STRING
,
.
z
=
pItem
->
name
,
.
n
=
(
uint32_t
)
strlen
(
pItem
->
name
)};
if
(
getColumnIndexByName
(
pCmd
,
&
name
,
pQueryInfo
,
&
columnIndex
)
!=
TSDB_CODE_SUCCESS
)
{
...
...
@@ -5559,11 +5560,11 @@ int32_t setAlterTableInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) {
(
pItem
->
type
==
TSDB_DATA_TYPE_NCHAR
&&
(
pItem
->
bytes
<=
0
||
pItem
->
bytes
>
TSDB_MAX_NCHAR_LEN
)))
{
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg24
);
}
if
(
pItem
->
bytes
<=
pColSchema
->
bytes
)
{
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg22
);
}
TAOS_FIELD
f
=
tscCreateField
(
pColSchema
->
type
,
name
.
z
,
pItem
->
bytes
);
tscFieldInfoAppend
(
&
pQueryInfo
->
fieldsInfo
,
&
f
);
}
else
if
(
pAlterSQL
->
type
==
TSDB_ALTER_TABLE_MODIFY_TAG_COLUMN
)
{
...
...
@@ -5575,7 +5576,7 @@ int32_t setAlterTableInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) {
if
(
pItem
->
type
!=
TSDB_DATA_TYPE_BINARY
&&
pItem
->
type
!=
TSDB_DATA_TYPE_NCHAR
)
{
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg21
);
}
SColumnIndex
columnIndex
=
COLUMN_INDEX_INITIALIZER
;
SStrToken
name
=
{.
type
=
TK_STRING
,
.
z
=
pItem
->
name
,
.
n
=
(
uint32_t
)
strlen
(
pItem
->
name
)};
if
(
getColumnIndexByName
(
pCmd
,
&
name
,
pQueryInfo
,
&
columnIndex
)
!=
TSDB_CODE_SUCCESS
)
{
...
...
@@ -5600,11 +5601,11 @@ int32_t setAlterTableInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) {
(
pItem
->
type
==
TSDB_DATA_TYPE_NCHAR
&&
(
pItem
->
bytes
<=
0
||
pItem
->
bytes
>
TSDB_MAX_NCHAR_LEN
)))
{
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg24
);
}
if
(
pItem
->
bytes
<=
pColSchema
->
bytes
)
{
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg22
);
}
TAOS_FIELD
f
=
tscCreateField
(
pColSchema
->
type
,
name
.
z
,
pItem
->
bytes
);
tscFieldInfoAppend
(
&
pQueryInfo
->
fieldsInfo
,
&
f
);
}
...
...
@@ -5970,7 +5971,7 @@ static int32_t setKeepOption(SSqlCmd* pCmd, SCreateDbMsg* pMsg, SCreateDbInfo* p
tVariantListItem
*
p0
=
taosArrayGet
(
pKeep
,
0
);
tVariantListItem
*
p1
=
(
s
>
1
)
?
taosArrayGet
(
pKeep
,
1
)
:
p0
;
tVariantListItem
*
p2
=
(
s
>
2
)
?
taosArrayGet
(
pKeep
,
2
)
:
p1
;
if
((
int32_t
)
p0
->
pVar
.
i64
<=
0
||
(
int32_t
)
p1
->
pVar
.
i64
<=
0
||
(
int32_t
)
p2
->
pVar
.
i64
<=
0
)
{
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg2
);
}
...
...
@@ -7064,7 +7065,7 @@ int32_t doCheckForStream(SSqlObj* pSql, SSqlInfo* pInfo) {
}
else
{
if
(
pQueryInfo
->
interval
.
interval
==
0
)
{
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg7
);
}
}
}
// set the created table[stream] name
...
...
@@ -7787,7 +7788,7 @@ int32_t validateSqlNode(SSqlObj* pSql, SSqlNode* pSqlNode, SQueryInfo* pQueryInf
}
}
// todo derivat
e fun
tion requires ts column exists in subquery
// todo derivat
ive func
tion requires ts column exists in subquery
STableMeta
*
pTableMeta
=
tscGetMetaInfo
(
pQueryInfo
,
0
)
->
pTableMeta
;
SSchema
*
pSchema
=
tscGetTableColumnSchema
(
pTableMeta
,
0
);
...
...
@@ -7880,7 +7881,7 @@ int32_t validateSqlNode(SSqlObj* pSql, SSqlNode* pSqlNode, SQueryInfo* pQueryInf
TSDB_CODE_SUCCESS
)
{
return
TSDB_CODE_TSC_INVALID_OPERATION
;
}
// parse the window_state
// parse the window_state
if
(
validateStateWindowNode
(
pCmd
,
pQueryInfo
,
pSqlNode
,
isSTable
)
!=
TSDB_CODE_SUCCESS
)
{
return
TSDB_CODE_TSC_INVALID_OPERATION
;
}
...
...
@@ -8095,7 +8096,7 @@ int32_t exprTreeFromSqlExpr(SSqlCmd* pCmd, tExprNode **pExpr, const tSqlExpr* pS
SColIndex
*
idx
=
taosArrayGet
(
pCols
,
0
);
SSchema
*
pSchema
=
tscGetTableColumnSchema
(
pTableMeta
,
idx
->
colIndex
);
if
(
pSchema
!=
NULL
)
{
colType
=
pSchema
->
type
;
colType
=
pSchema
->
type
;
}
}
...
...
src/client/src/tscSub.c
浏览文件 @
55757e16
...
...
@@ -283,6 +283,7 @@ static int tscUpdateSubscription(STscObj* pObj, SSub* pSub) {
SArray
*
tables
=
getTableList
(
pSql
);
if
(
tables
==
NULL
)
{
pSub
->
lastSyncTime
=
0
;
//force to get table list next time
return
0
;
}
size_t
numOfTables
=
taosArrayGetSize
(
tables
);
...
...
@@ -489,7 +490,15 @@ TAOS_RES *taos_consume(TAOS_SUB *tsub) {
SSub
*
pSub
=
(
SSub
*
)
tsub
;
if
(
pSub
==
NULL
)
return
NULL
;
if
(
pSub
->
pSql
->
cmd
.
command
==
TSDB_SQL_RETRIEVE_EMPTY_RESULT
)
{
if
(
pSub
->
pTimer
==
NULL
)
{
int64_t
duration
=
taosGetTimestampMs
()
-
pSub
->
lastConsumeTime
;
if
(
duration
<
(
int64_t
)(
pSub
->
interval
))
{
tscDebug
(
"subscription consume too frequently, blocking..."
);
taosMsleep
(
pSub
->
interval
-
(
int32_t
)
duration
);
}
}
if
(
pSub
->
pSql
->
cmd
.
command
==
TSDB_SQL_RETRIEVE_EMPTY_RESULT
)
{
//may reach here when retireve stable vgroup failed
SSqlObj
*
pSql
=
recreateSqlObj
(
pSub
);
if
(
pSql
==
NULL
)
{
return
NULL
;
...
...
@@ -503,6 +512,11 @@ TAOS_RES *taos_consume(TAOS_SUB *tsub) {
pSub
->
pSql
=
pSql
;
pSql
->
pSubscription
=
pSub
;
// no table list now, force to update it
tscDebug
(
"begin table synchronization"
);
if
(
!
tscUpdateSubscription
(
pSub
->
taos
,
pSub
))
return
NULL
;
tscDebug
(
"table synchronization completed"
);
}
tscSaveSubscriptionProgress
(
pSub
);
...
...
@@ -527,14 +541,6 @@ TAOS_RES *taos_consume(TAOS_SUB *tsub) {
tscDebug
(
"subscribe:%s set next round subscribe skey:%"
PRId64
,
pSub
->
topic
,
pQueryInfo
->
window
.
skey
);
}
if
(
pSub
->
pTimer
==
NULL
)
{
int64_t
duration
=
taosGetTimestampMs
()
-
pSub
->
lastConsumeTime
;
if
(
duration
<
(
int64_t
)(
pSub
->
interval
))
{
tscDebug
(
"subscription consume too frequently, blocking..."
);
taosMsleep
(
pSub
->
interval
-
(
int32_t
)
duration
);
}
}
size_t
size
=
taosArrayGetSize
(
pSub
->
progress
)
*
sizeof
(
STableIdInfo
);
size
+=
sizeof
(
SQueryTableMsg
)
+
4096
;
int
code
=
tscAllocPayload
(
&
pSql
->
cmd
,
(
int
)
size
);
...
...
src/client/src/tscSubquery.c
浏览文件 @
55757e16
...
...
@@ -109,7 +109,7 @@ bool subAndCheckDone(SSqlObj *pSql, SSqlObj *pParentSql, int idx) {
// pthread_mutex_unlock(&subState->mutex);
// return false;
// }
tscDebug
(
"0x%"
PRIx64
" subquery:0x%"
PRIx64
", index:%d state set to 1"
,
pParentSql
->
self
,
pSql
->
self
,
idx
);
subState
->
states
[
idx
]
=
1
;
...
...
@@ -622,7 +622,7 @@ static int32_t tscLaunchRealSubqueries(SSqlObj* pSql) {
int16_t
colId
=
tscGetJoinTagColIdByUid
(
&
pQueryInfo
->
tagCond
,
pTableMetaInfo
->
pTableMeta
->
id
.
uid
);
// set the tag column id for executor to extract correct tag value
#ifndef _TD_NINGSI_60
#ifndef _TD_NINGSI_60
pExpr
->
base
.
param
[
0
]
=
(
tVariant
)
{.
i64
=
colId
,
.
nType
=
TSDB_DATA_TYPE_BIGINT
,
.
nLen
=
sizeof
(
int64_t
)};
#else
pExpr
->
base
.
param
[
0
].
i64
=
colId
;
...
...
@@ -1843,7 +1843,7 @@ int32_t tscCreateJoinSubquery(SSqlObj *pSql, int16_t tableIndex, SJoinSupporter
// refactor as one method
SQueryInfo
*
pNewQueryInfo
=
tscGetQueryInfo
(
&
pNew
->
cmd
);
assert
(
pNewQueryInfo
!=
NULL
);
pSupporter
->
colList
=
pNewQueryInfo
->
colList
;
pNewQueryInfo
->
colList
=
NULL
;
...
...
@@ -3158,7 +3158,7 @@ int32_t tscHandleMultivnodeInsert(SSqlObj *pSql) {
pRes
->
code
=
TSDB_CODE_TSC_APP_ERROR
;
return
pRes
->
code
;
}
for
(
int32_t
i
=
0
;
i
<
pSql
->
subState
.
numOfSub
;
++
i
)
{
SSqlObj
*
pSub
=
pSql
->
pSubs
[
i
];
SInsertSupporter
*
pSup
=
calloc
(
1
,
sizeof
(
SInsertSupporter
));
...
...
src/client/src/tscUtil.c
浏览文件 @
55757e16
...
...
@@ -460,6 +460,22 @@ bool tscIsTWAQuery(SQueryInfo* pQueryInfo) {
return
false
;
}
bool
tscIsIrateQuery
(
SQueryInfo
*
pQueryInfo
)
{
size_t
numOfExprs
=
tscNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
numOfExprs
;
++
i
)
{
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
==
NULL
)
{
continue
;
}
if
(
pExpr
->
base
.
functionId
==
TSDB_FUNC_IRATE
)
{
return
true
;
}
}
return
false
;
}
bool
tscIsSessionWindowQuery
(
SQueryInfo
*
pQueryInfo
)
{
return
pQueryInfo
->
sessionWindow
.
gap
>
0
;
}
...
...
@@ -3477,6 +3493,7 @@ static void tscSubqueryRetrieveCallback(void* param, TAOS_RES* tres, int code) {
if
(
pSql
->
res
.
code
==
TSDB_CODE_SUCCESS
)
{
(
*
pSql
->
fp
)(
pParentSql
->
param
,
pParentSql
,
pParentSql
->
res
.
numOfRows
);
}
else
{
pParentSql
->
res
.
code
=
pSql
->
res
.
code
;
tscAsyncResultOnError
(
pParentSql
);
}
}
...
...
src/connector/jdbc/CMakeLists.txt
浏览文件 @
55757e16
...
...
@@ -12,4 +12,4 @@ IF (TD_MVN_INSTALLED)
COMMAND mvn -Dmaven.test.skip=true clean -f
${
CMAKE_CURRENT_SOURCE_DIR
}
/pom.xml
COMMENT
"build jdbc driver"
)
ADD_CUSTOM_TARGET
(
${
JDBC_TARGET_NAME
}
ALL WORKING_DIRECTORY
${
EXECUTABLE_OUTPUT_PATH
}
DEPENDS
${
JDBC_CMD_NAME
}
)
ENDIF
()
ENDIF
()
\ No newline at end of file
src/connector/jdbc/pom.xml
浏览文件 @
55757e16
...
...
@@ -122,7 +122,6 @@
<exclude>
**/FailOverTest.java
</exclude>
<exclude>
**/InvalidResultSetPointerTest.java
</exclude>
<exclude>
**/RestfulConnectionTest.java
</exclude>
<exclude>
**/TD4144Test.java
</exclude>
<exclude>
**/ConnectMultiTaosdByRestfulWithDifferentTokenTest.java
</exclude>
</excludes>
<testFailureIgnore>
true
</testFailureIgnore>
...
...
src/connector/jdbc/src/main/java/com/taosdata/jdbc/AbstractConnection.java
浏览文件 @
55757e16
package
com.taosdata.jdbc
;
import
com.taosdata.jdbc.rs.enums.TimestampFormat
;
import
java.sql.*
;
import
java.util.Enumeration
;
import
java.util.Map
;
...
...
@@ -18,7 +20,7 @@ public abstract class AbstractConnection extends WrapperImpl implements Connecti
for
(
String
propName
:
propNames
)
{
clientInfoProps
.
setProperty
(
propName
,
properties
.
getProperty
(
propName
));
}
String
timestampFormat
=
properties
.
getProperty
(
TSDBDriver
.
PROPERTY_KEY_TIMESTAMP_FORMAT
,
"STRING"
);
String
timestampFormat
=
properties
.
getProperty
(
TSDBDriver
.
PROPERTY_KEY_TIMESTAMP_FORMAT
,
String
.
valueOf
(
TimestampFormat
.
STRING
)
);
clientInfoProps
.
setProperty
(
TSDBDriver
.
PROPERTY_KEY_TIMESTAMP_FORMAT
,
timestampFormat
);
}
...
...
@@ -516,7 +518,6 @@ public abstract class AbstractConnection extends WrapperImpl implements Connecti
public
void
abort
(
Executor
executor
)
throws
SQLException
{
if
(
isClosed
())
throw
TSDBError
.
createSQLException
(
TSDBErrorNumbers
.
ERROR_CONNECTION_CLOSED
);
// do nothing
}
...
...
src/connector/jdbc/src/main/java/com/taosdata/jdbc/AbstractStatement.java
浏览文件 @
55757e16
...
...
@@ -9,8 +9,6 @@ public abstract class AbstractStatement extends WrapperImpl implements Statement
protected
List
<
String
>
batchedArgs
;
private
int
fetchSize
;
@Override
public
abstract
ResultSet
executeQuery
(
String
sql
)
throws
SQLException
;
...
...
src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBError.java
浏览文件 @
55757e16
...
...
@@ -32,6 +32,7 @@ public class TSDBError {
TSDBErrorMap
.
put
(
TSDBErrorNumbers
.
ERROR_INVALID_SQL
,
"invalid sql"
);
TSDBErrorMap
.
put
(
TSDBErrorNumbers
.
ERROR_NUMERIC_VALUE_OUT_OF_RANGE
,
"numeric value out of range"
);
TSDBErrorMap
.
put
(
TSDBErrorNumbers
.
ERROR_UNKNOWN_TAOS_TYPE_IN_TDENGINE
,
"unknown taos type in tdengine"
);
TSDBErrorMap
.
put
(
TSDBErrorNumbers
.
ERROR_UNKNOWN_TIMESTAMP_PERCISION
,
"unknown timestamp precision"
);
/**************************************************/
TSDBErrorMap
.
put
(
TSDBErrorNumbers
.
ERROR_UNKNOWN
,
"unknown error"
);
...
...
src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBErrorNumbers.java
浏览文件 @
55757e16
...
...
@@ -25,6 +25,7 @@ public class TSDBErrorNumbers {
public
static
final
int
ERROR_INVALID_SQL
=
0x2313
;
// invalid sql
public
static
final
int
ERROR_NUMERIC_VALUE_OUT_OF_RANGE
=
0x2314
;
// numeric value out of range
public
static
final
int
ERROR_UNKNOWN_TAOS_TYPE_IN_TDENGINE
=
0x2315
;
//unknown taos type in tdengine
public
static
final
int
ERROR_UNKNOWN_TIMESTAMP_PERCISION
=
0x2316
;
// unknown timestamp precision
public
static
final
int
ERROR_UNKNOWN
=
0x2350
;
//unknown error
...
...
@@ -62,6 +63,7 @@ public class TSDBErrorNumbers {
errorNumbers
.
add
(
ERROR_INVALID_SQL
);
errorNumbers
.
add
(
ERROR_NUMERIC_VALUE_OUT_OF_RANGE
);
errorNumbers
.
add
(
ERROR_UNKNOWN_TAOS_TYPE_IN_TDENGINE
);
errorNumbers
.
add
(
ERROR_UNKNOWN_TIMESTAMP_PERCISION
);
/*****************************************************/
errorNumbers
.
add
(
ERROR_SUBSCRIBE_FAILED
);
...
...
src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBJNIConnector.java
浏览文件 @
55757e16
...
...
@@ -216,6 +216,16 @@ public class TSDBJNIConnector {
private
native
int
fetchBlockImp
(
long
connection
,
long
resultSet
,
TSDBResultSetBlockData
blockData
);
/**
* Get Result Time Precision.
* @return 0: ms, 1: us, 2: ns
*/
public
int
getResultTimePrecision
(
long
sqlObj
)
{
return
this
.
getResultTimePrecisionImp
(
this
.
taos
,
sqlObj
);
}
private
native
int
getResultTimePrecisionImp
(
long
connection
,
long
result
);
/**
* Execute close operation from C to release connection pointer by JNI
*
...
...
src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBPreparedStatement.java
浏览文件 @
55757e16
...
...
@@ -38,7 +38,6 @@ import java.util.regex.Pattern;
public
class
TSDBPreparedStatement
extends
TSDBStatement
implements
PreparedStatement
{
private
String
rawSql
;
private
Object
[]
parameters
;
private
boolean
isPrepared
;
private
ArrayList
<
ColumnInfo
>
colData
;
private
ArrayList
<
TableTagInfo
>
tableTags
;
...
...
@@ -47,8 +46,6 @@ public class TSDBPreparedStatement extends TSDBStatement implements PreparedStat
private
String
tableName
;
private
long
nativeStmtHandle
=
0
;
private
volatile
TSDBParameterMetaData
parameterMetaData
;
TSDBPreparedStatement
(
TSDBConnection
connection
,
String
sql
)
{
super
(
connection
);
init
(
sql
);
...
...
@@ -61,7 +58,6 @@ public class TSDBPreparedStatement extends TSDBStatement implements PreparedStat
}
}
parameters
=
new
Object
[
parameterCnt
];
this
.
isPrepared
=
true
;
}
if
(
parameterCnt
>
1
)
{
...
...
@@ -76,11 +72,6 @@ public class TSDBPreparedStatement extends TSDBStatement implements PreparedStat
preprocessSql
();
}
@Override
public
int
[]
executeBatch
()
throws
SQLException
{
return
super
.
executeBatch
();
}
/*
* Some of the SQLs sent by other popular frameworks or tools like Spark, contains syntax that cannot be parsed by
* the TDengine client. Thus, some simple parsers/filters are intentionally added in this JDBC implementation in
...
...
@@ -137,29 +128,15 @@ public class TSDBPreparedStatement extends TSDBStatement implements PreparedStat
/***** for inner queries *****/
}
/**
* Populate parameters into prepared sql statements
*
* @return a string of the native sql statement for TSDB
*/
private
String
getNativeSql
(
String
rawSql
)
throws
SQLException
{
return
Utils
.
getNativeSql
(
rawSql
,
this
.
parameters
);
}
@Override
public
ResultSet
executeQuery
()
throws
SQLException
{
if
(!
isPrepared
)
return
executeQuery
(
this
.
rawSql
);
final
String
sql
=
getNativeSql
(
this
.
rawSql
);
final
String
sql
=
Utils
.
getNativeSql
(
this
.
rawSql
,
this
.
parameters
);
return
executeQuery
(
sql
);
}
@Override
public
int
executeUpdate
()
throws
SQLException
{
if
(!
isPrepared
)
return
executeUpdate
(
this
.
rawSql
);
String
sql
=
getNativeSql
(
this
.
rawSql
);
String
sql
=
Utils
.
getNativeSql
(
this
.
rawSql
,
this
.
parameters
);
return
executeUpdate
(
sql
);
}
...
...
@@ -282,25 +259,14 @@ public class TSDBPreparedStatement extends TSDBStatement implements PreparedStat
@Override
public
boolean
execute
()
throws
SQLException
{
if
(!
isPrepared
)
return
execute
(
this
.
rawSql
);
final
String
sql
=
getNativeSql
(
this
.
rawSql
);
final
String
sql
=
Utils
.
getNativeSql
(
this
.
rawSql
,
this
.
parameters
);
return
execute
(
sql
);
}
@Override
public
void
addBatch
()
throws
SQLException
{
if
(
this
.
batchedArgs
==
null
)
{
batchedArgs
=
new
ArrayList
<>();
}
if
(!
isPrepared
)
{
addBatch
(
this
.
rawSql
);
}
else
{
String
sql
=
this
.
getConnection
().
nativeSQL
(
this
.
rawSql
);
addBatch
(
sql
);
}
String
sql
=
Utils
.
getNativeSql
(
this
.
rawSql
,
this
.
parameters
);
addBatch
(
sql
);
}
@Override
...
...
src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBResultSetRowData.java
浏览文件 @
55757e16
...
...
@@ -147,30 +147,14 @@ public class TSDBResultSetRowData {
case
TSDBConstants
.
TSDB_DATA_TYPE_NCHAR
:
case
TSDBConstants
.
TSDB_DATA_TYPE_BINARY
:
return
Integer
.
parseInt
((
String
)
obj
);
case
TSDBConstants
.
TSDB_DATA_TYPE_UTINYINT
:
{
Byte
value
=
(
byte
)
obj
;
if
(
value
<
0
)
throw
TSDBError
.
createSQLException
(
TSDBErrorNumbers
.
ERROR_NUMERIC_VALUE_OUT_OF_RANGE
);
return
value
;
}
case
TSDBConstants
.
TSDB_DATA_TYPE_USMALLINT
:
{
short
value
=
(
short
)
obj
;
if
(
value
<
0
)
throw
TSDBError
.
createSQLException
(
TSDBErrorNumbers
.
ERROR_NUMERIC_VALUE_OUT_OF_RANGE
);
return
value
;
}
case
TSDBConstants
.
TSDB_DATA_TYPE_UINT
:
{
int
value
=
(
int
)
obj
;
if
(
value
<
0
)
throw
TSDBError
.
createSQLException
(
TSDBErrorNumbers
.
ERROR_NUMERIC_VALUE_OUT_OF_RANGE
);
return
value
;
}
case
TSDBConstants
.
TSDB_DATA_TYPE_UBIGINT
:
{
long
value
=
(
long
)
obj
;
if
(
value
<
0
)
throw
TSDBError
.
createSQLException
(
TSDBErrorNumbers
.
ERROR_NUMERIC_VALUE_OUT_OF_RANGE
);
return
Long
.
valueOf
(
value
).
intValue
();
}
case
TSDBConstants
.
TSDB_DATA_TYPE_UTINYINT
:
return
parseUnsignedTinyIntToInt
(
obj
);
case
TSDBConstants
.
TSDB_DATA_TYPE_USMALLINT
:
return
parseUnsignedSmallIntToInt
(
obj
);
case
TSDBConstants
.
TSDB_DATA_TYPE_UINT
:
return
parseUnsignedIntegerToInt
(
obj
);
case
TSDBConstants
.
TSDB_DATA_TYPE_UBIGINT
:
return
parseUnsignedBigIntToInt
(
obj
);
case
TSDBConstants
.
TSDB_DATA_TYPE_FLOAT
:
return
((
Float
)
obj
).
intValue
();
case
TSDBConstants
.
TSDB_DATA_TYPE_DOUBLE
:
...
...
@@ -180,6 +164,35 @@ public class TSDBResultSetRowData {
}
}
private
byte
parseUnsignedTinyIntToInt
(
Object
obj
)
throws
SQLException
{
byte
value
=
(
byte
)
obj
;
if
(
value
<
0
)
throw
TSDBError
.
createSQLException
(
TSDBErrorNumbers
.
ERROR_NUMERIC_VALUE_OUT_OF_RANGE
);
return
value
;
}
private
short
parseUnsignedSmallIntToInt
(
Object
obj
)
throws
SQLException
{
short
value
=
(
short
)
obj
;
if
(
value
<
0
)
throw
TSDBError
.
createSQLException
(
TSDBErrorNumbers
.
ERROR_NUMERIC_VALUE_OUT_OF_RANGE
);
return
value
;
}
private
int
parseUnsignedIntegerToInt
(
Object
obj
)
throws
SQLException
{
int
value
=
(
int
)
obj
;
if
(
value
<
0
)
throw
TSDBError
.
createSQLException
(
TSDBErrorNumbers
.
ERROR_NUMERIC_VALUE_OUT_OF_RANGE
);
return
value
;
}
private
int
parseUnsignedBigIntToInt
(
Object
obj
)
throws
SQLException
{
long
value
=
(
long
)
obj
;
if
(
value
<
0
)
throw
TSDBError
.
createSQLException
(
TSDBErrorNumbers
.
ERROR_NUMERIC_VALUE_OUT_OF_RANGE
);
return
Long
.
valueOf
(
value
).
intValue
();
}
/**
* $$$ this method is invoked by databaseMetaDataResultSet and so on which use a index start from 1 in JDBC api
*/
...
...
@@ -216,7 +229,7 @@ public class TSDBResultSetRowData {
case
TSDBConstants
.
TSDB_DATA_TYPE_BINARY
:
return
Long
.
parseLong
((
String
)
obj
);
case
TSDBConstants
.
TSDB_DATA_TYPE_UTINYINT
:
{
B
yte
value
=
(
byte
)
obj
;
b
yte
value
=
(
byte
)
obj
;
if
(
value
<
0
)
throw
TSDBError
.
createSQLException
(
TSDBErrorNumbers
.
ERROR_NUMERIC_VALUE_OUT_OF_RANGE
);
return
value
;
...
...
@@ -414,26 +427,40 @@ public class TSDBResultSetRowData {
* $$$ this method is invoked by databaseMetaDataResultSet and so on which use a index start from 1 in JDBC api
*/
public
void
setTimestampValue
(
int
colIndex
,
long
value
)
{
setTimestamp
(
colIndex
-
1
,
value
);
setTimestamp
(
colIndex
-
1
,
value
,
0
);
}
/**
* !!! this method is invoked by JNI method and the index start from 0 in C implementations
* @param precision 0 : ms, 1 : us, 2 : ns
*/
public
void
setTimestamp
(
int
col
,
long
ts
)
{
//TODO: this implementation contains logical error
// when precision is us the (long ts) is 16 digital number
// when precision is ms, the (long ts) is 13 digital number
// we need a JNI function like this:
// public void setTimestamp(int col, long epochSecond, long nanoAdjustment)
if
(
ts
<
1_0000_0000_0000_0L
)
{
data
.
set
(
col
,
new
Timestamp
(
ts
));
}
else
{
long
epochSec
=
ts
/
1000_000
l
;
long
nanoAdjustment
=
ts
%
1000_000
l
*
1000
l
;
Timestamp
timestamp
=
Timestamp
.
from
(
Instant
.
ofEpochSecond
(
epochSec
,
nanoAdjustment
));
data
.
set
(
col
,
timestamp
);
public
void
setTimestamp
(
int
col
,
long
ts
,
int
precision
)
{
long
milliseconds
=
0
;
int
fracNanoseconds
=
0
;
switch
(
precision
)
{
case
0
:
{
milliseconds
=
ts
;
fracNanoseconds
=
(
int
)(
ts
*
1_000_000
%
1_000_000_000
);
break
;
}
case
1
:
{
milliseconds
=
ts
/
1_000
;
fracNanoseconds
=
(
int
)(
ts
*
1_000
%
1_000_000_000
);
break
;
}
case
2
:
{
milliseconds
=
ts
/
1_000_000
;
fracNanoseconds
=
(
int
)(
ts
%
1_000_000_000
);
break
;
}
default
:
{
throw
new
IllegalArgumentException
(
"precision is not valid. precision: "
+
precision
);
}
}
Timestamp
tsObj
=
new
Timestamp
(
milliseconds
);
tsObj
.
setNanos
(
fracNanoseconds
);
data
.
set
(
col
,
tsObj
);
}
public
Timestamp
getTimestamp
(
int
col
,
int
nativeType
)
{
...
...
src/connector/jdbc/src/main/java/com/taosdata/jdbc/enums/TimestampPrecision.java
0 → 100644
浏览文件 @
55757e16
package
com.taosdata.jdbc.enums
;
public
enum
TimestampPrecision
{
MS
,
US
,
NS
,
UNKNOWN
}
src/connector/jdbc/src/main/java/com/taosdata/jdbc/rs/RestfulPreparedStatement.java
浏览文件 @
55757e16
...
...
@@ -44,7 +44,7 @@ public class RestfulPreparedStatement extends RestfulStatement implements Prepar
if
(!
isPrepared
)
return
executeQuery
(
this
.
rawSql
);
final
String
sql
=
getNativeSql
(
this
.
rawSql
);
final
String
sql
=
Utils
.
getNativeSql
(
this
.
rawSql
,
this
.
parameters
);
return
executeQuery
(
sql
);
}
...
...
@@ -55,20 +55,10 @@ public class RestfulPreparedStatement extends RestfulStatement implements Prepar
if
(!
isPrepared
)
return
executeUpdate
(
this
.
rawSql
);
final
String
sql
=
getNativeSql
(
this
.
rawSql
);
final
String
sql
=
Utils
.
getNativeSql
(
rawSql
,
this
.
parameters
);
return
executeUpdate
(
sql
);
}
/****
* 将rawSql转换成一条可执行的sql语句,使用属性parameters中的变脸进行替换
* 对于insert into ?.? (?,?,?) using ?.? (?,?,?) tags(?, ?, ?) values(?, ?, ?)
* @param rawSql,可能是insert、select或其他,使用?做占位符
* @return
*/
private
String
getNativeSql
(
String
rawSql
)
{
return
Utils
.
getNativeSql
(
rawSql
,
this
.
parameters
);
}
@Override
public
void
setNull
(
int
parameterIndex
,
int
sqlType
)
throws
SQLException
{
if
(
isClosed
())
...
...
@@ -224,16 +214,13 @@ public class RestfulPreparedStatement extends RestfulStatement implements Prepar
throw
TSDBError
.
createSQLException
(
TSDBErrorNumbers
.
ERROR_STATEMENT_CLOSED
);
if
(!
isPrepared
)
return
execute
(
this
.
rawSql
);
final
String
sql
=
getNativeSql
(
rawSql
);
final
String
sql
=
Utils
.
getNativeSql
(
rawSql
,
this
.
parameters
);
return
execute
(
sql
);
}
@Override
public
void
addBatch
()
throws
SQLException
{
if
(
isClosed
())
throw
TSDBError
.
createSQLException
(
TSDBErrorNumbers
.
ERROR_STATEMENT_CLOSED
);
final
String
sql
=
getNativeSql
(
this
.
rawSql
);
final
String
sql
=
Utils
.
getNativeSql
(
rawSql
,
this
.
parameters
);
addBatch
(
sql
);
}
...
...
src/connector/jdbc/src/main/java/com/taosdata/jdbc/rs/RestfulResultSet.java
浏览文件 @
55757e16
...
...
@@ -6,6 +6,8 @@ import com.google.common.primitives.Ints;
import
com.google.common.primitives.Longs
;
import
com.google.common.primitives.Shorts
;
import
com.taosdata.jdbc.*
;
import
com.taosdata.jdbc.enums.TimestampPrecision
;
import
com.taosdata.jdbc.rs.enums.TimestampFormat
;
import
com.taosdata.jdbc.utils.Utils
;
import
java.math.BigDecimal
;
...
...
@@ -46,6 +48,7 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
columnNames
.
clear
();
columns
.
clear
();
this
.
resultSet
.
clear
();
this
.
metaData
=
new
RestfulResultSetMetaData
(
this
.
database
,
null
,
this
);
return
;
}
// get head
...
...
@@ -131,7 +134,6 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
}
}
private
Object
parseColumnData
(
JSONArray
row
,
int
colIndex
,
int
taosType
)
throws
SQLException
{
switch
(
taosType
)
{
case
TSDBConstants
.
TSDB_DATA_TYPE_NULL
:
...
...
@@ -150,44 +152,8 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
return
row
.
getFloat
(
colIndex
);
case
TSDBConstants
.
TSDB_DATA_TYPE_DOUBLE
:
return
row
.
getDouble
(
colIndex
);
case
TSDBConstants
.
TSDB_DATA_TYPE_TIMESTAMP
:
{
if
(
row
.
get
(
colIndex
)
==
null
)
return
null
;
String
timestampFormat
=
this
.
statement
.
getConnection
().
getClientInfo
(
TSDBDriver
.
PROPERTY_KEY_TIMESTAMP_FORMAT
);
if
(
"TIMESTAMP"
.
equalsIgnoreCase
(
timestampFormat
))
{
Long
value
=
row
.
getLong
(
colIndex
);
//TODO: this implementation has bug if the timestamp bigger than 9999_9999_9999_9
if
(
value
<
1_0000_0000_0000_0L
)
return
new
Timestamp
(
value
);
long
epochSec
=
value
/
1000_000
l
;
long
nanoAdjustment
=
value
%
1000_000
l
*
1000
l
;
return
Timestamp
.
from
(
Instant
.
ofEpochSecond
(
epochSec
,
nanoAdjustment
));
}
if
(
"UTC"
.
equalsIgnoreCase
(
timestampFormat
))
{
String
value
=
row
.
getString
(
colIndex
);
long
epochSec
=
Timestamp
.
valueOf
(
value
.
substring
(
0
,
19
).
replace
(
"T"
,
" "
)).
getTime
()
/
1000
;
int
fractionalSec
=
Integer
.
parseInt
(
value
.
substring
(
20
,
value
.
length
()
-
5
));
long
nanoAdjustment
=
0
;
if
(
value
.
length
()
>
28
)
{
// ms timestamp: yyyy-MM-ddTHH:mm:ss.SSSSSS+0x00
nanoAdjustment
=
fractionalSec
*
1000
l
;
}
else
{
// ms timestamp: yyyy-MM-ddTHH:mm:ss.SSS+0x00
nanoAdjustment
=
fractionalSec
*
1000_000
l
;
}
ZoneOffset
zoneOffset
=
ZoneOffset
.
of
(
value
.
substring
(
value
.
length
()
-
5
));
Instant
instant
=
Instant
.
ofEpochSecond
(
epochSec
,
nanoAdjustment
).
atOffset
(
zoneOffset
).
toInstant
();
return
Timestamp
.
from
(
instant
);
}
String
value
=
row
.
getString
(
colIndex
);
if
(
value
.
length
()
<=
23
)
// ms timestamp: yyyy-MM-dd HH:mm:ss.SSS
return
row
.
getTimestamp
(
colIndex
);
// us timestamp: yyyy-MM-dd HH:mm:ss.SSSSSS
long
epochSec
=
Timestamp
.
valueOf
(
value
.
substring
(
0
,
19
)).
getTime
()
/
1000
;
long
nanoAdjustment
=
Integer
.
parseInt
(
value
.
substring
(
20
))
*
1000
l
;
Timestamp
timestamp
=
Timestamp
.
from
(
Instant
.
ofEpochSecond
(
epochSec
,
nanoAdjustment
));
return
timestamp
;
}
case
TSDBConstants
.
TSDB_DATA_TYPE_TIMESTAMP
:
return
parseTimestampColumnData
(
row
,
colIndex
);
case
TSDBConstants
.
TSDB_DATA_TYPE_BINARY
:
return
row
.
getString
(
colIndex
)
==
null
?
null
:
row
.
getString
(
colIndex
).
getBytes
();
case
TSDBConstants
.
TSDB_DATA_TYPE_NCHAR
:
...
...
@@ -197,7 +163,66 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
}
}
public
class
Field
{
private
Timestamp
parseTimestampColumnData
(
JSONArray
row
,
int
colIndex
)
throws
SQLException
{
if
(
row
.
get
(
colIndex
)
==
null
)
return
null
;
String
tsFormatUpperCase
=
this
.
statement
.
getConnection
().
getClientInfo
(
TSDBDriver
.
PROPERTY_KEY_TIMESTAMP_FORMAT
).
toUpperCase
();
TimestampFormat
timestampFormat
=
TimestampFormat
.
valueOf
(
tsFormatUpperCase
);
switch
(
timestampFormat
)
{
case
TIMESTAMP:
{
Long
value
=
row
.
getLong
(
colIndex
);
//TODO: this implementation has bug if the timestamp bigger than 9999_9999_9999_9
if
(
value
<
1_0000_0000_0000_0L
)
return
new
Timestamp
(
value
);
long
epochSec
=
value
/
1000_000
l
;
long
nanoAdjustment
=
value
%
1000_000
l
*
1000
l
;
return
Timestamp
.
from
(
Instant
.
ofEpochSecond
(
epochSec
,
nanoAdjustment
));
}
case
UTC:
{
String
value
=
row
.
getString
(
colIndex
);
long
epochSec
=
Timestamp
.
valueOf
(
value
.
substring
(
0
,
19
).
replace
(
"T"
,
" "
)).
getTime
()
/
1000
;
int
fractionalSec
=
Integer
.
parseInt
(
value
.
substring
(
20
,
value
.
length
()
-
5
));
long
nanoAdjustment
;
if
(
value
.
length
()
>
31
)
{
// ns timestamp: yyyy-MM-ddTHH:mm:ss.SSSSSSSSS+0x00
nanoAdjustment
=
fractionalSec
;
}
else
if
(
value
.
length
()
>
28
)
{
// ms timestamp: yyyy-MM-ddTHH:mm:ss.SSSSSS+0x00
nanoAdjustment
=
fractionalSec
*
1000L
;
}
else
{
// ms timestamp: yyyy-MM-ddTHH:mm:ss.SSS+0x00
nanoAdjustment
=
fractionalSec
*
1000_000L
;
}
ZoneOffset
zoneOffset
=
ZoneOffset
.
of
(
value
.
substring
(
value
.
length
()
-
5
));
Instant
instant
=
Instant
.
ofEpochSecond
(
epochSec
,
nanoAdjustment
).
atOffset
(
zoneOffset
).
toInstant
();
return
Timestamp
.
from
(
instant
);
}
case
STRING:
default
:
{
String
value
=
row
.
getString
(
colIndex
);
TimestampPrecision
precision
=
Utils
.
guessTimestampPrecision
(
value
);
if
(
precision
==
TimestampPrecision
.
MS
)
{
// ms timestamp: yyyy-MM-dd HH:mm:ss.SSS
return
row
.
getTimestamp
(
colIndex
);
}
if
(
precision
==
TimestampPrecision
.
US
)
{
// us timestamp: yyyy-MM-dd HH:mm:ss.SSSSSS
long
epochSec
=
Timestamp
.
valueOf
(
value
.
substring
(
0
,
19
)).
getTime
()
/
1000
;
long
nanoAdjustment
=
Integer
.
parseInt
(
value
.
substring
(
20
))
*
1000L
;
return
Timestamp
.
from
(
Instant
.
ofEpochSecond
(
epochSec
,
nanoAdjustment
));
}
if
(
precision
==
TimestampPrecision
.
NS
)
{
// ms timestamp: yyyy-MM-dd HH:mm:ss.SSSSSSSSS
long
epochSec
=
Timestamp
.
valueOf
(
value
.
substring
(
0
,
19
)).
getTime
()
/
1000
;
long
nanoAdjustment
=
Integer
.
parseInt
(
value
.
substring
(
20
));
return
Timestamp
.
from
(
Instant
.
ofEpochSecond
(
epochSec
,
nanoAdjustment
));
}
throw
TSDBError
.
createSQLException
(
TSDBErrorNumbers
.
ERROR_UNKNOWN_TIMESTAMP_PERCISION
);
}
}
}
public
static
class
Field
{
String
name
;
int
type
;
int
length
;
...
...
@@ -211,6 +236,7 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
this
.
note
=
note
;
this
.
taos_type
=
taos_type
;
}
}
@Override
...
...
@@ -334,6 +360,7 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
wasNull
=
true
;
return
0
;
}
wasNull
=
false
;
if
(
value
instanceof
Timestamp
)
{
return
((
Timestamp
)
value
).
getTime
();
...
...
src/connector/jdbc/src/main/java/com/taosdata/jdbc/rs/RestfulResultSetMetaData.java
浏览文件 @
55757e16
...
...
@@ -8,20 +8,22 @@ import java.sql.SQLException;
import
java.sql.Timestamp
;
import
java.sql.Types
;
import
java.util.ArrayList
;
import
java.util.Collections
;
import
java.util.List
;
public
class
RestfulResultSetMetaData
extends
WrapperImpl
implements
ResultSetMetaData
{
private
final
String
database
;
private
Array
List
<
RestfulResultSet
.
Field
>
fields
;
private
List
<
RestfulResultSet
.
Field
>
fields
;
private
final
RestfulResultSet
resultSet
;
public
RestfulResultSetMetaData
(
String
database
,
ArrayList
<
RestfulResultSet
.
Field
>
fields
,
RestfulResultSet
resultSet
)
{
this
.
database
=
database
;
this
.
fields
=
fields
;
this
.
fields
=
fields
==
null
?
Collections
.
emptyList
()
:
fields
;
this
.
resultSet
=
resultSet
;
}
public
Array
List
<
RestfulResultSet
.
Field
>
getFields
()
{
public
List
<
RestfulResultSet
.
Field
>
getFields
()
{
return
fields
;
}
...
...
src/connector/jdbc/src/main/java/com/taosdata/jdbc/rs/enums/TimestampFormat.java
0 → 100644
浏览文件 @
55757e16
package
com.taosdata.jdbc.rs.enums
;
public
enum
TimestampFormat
{
STRING
,
TIMESTAMP
,
UTC
}
src/connector/jdbc/src/main/java/com/taosdata/jdbc/utils/HttpClientPoolUtil.java
浏览文件 @
55757e16
...
...
@@ -16,13 +16,12 @@ import org.apache.http.protocol.HTTP;
import
org.apache.http.protocol.HttpContext
;
import
org.apache.http.util.EntityUtils
;
import
java.nio.charset.
Charset
;
import
java.nio.charset.
StandardCharsets
;
public
class
HttpClientPoolUtil
{
private
static
final
String
DEFAULT_CONTENT_TYPE
=
"application/json"
;
private
static
final
String
DEFAULT_TOKEN
=
"cm9vdDp0YW9zZGF0YQ=="
;
private
static
final
int
DEFAULT_TIME_OUT
=
15000
;
private
static
final
int
DEFAULT_MAX_PER_ROUTE
=
32
;
private
static
final
int
DEFAULT_MAX_TOTAL
=
1000
;
...
...
@@ -80,7 +79,7 @@ public class HttpClientPoolUtil {
method
.
setHeader
(
"Connection"
,
"keep-alive"
);
method
.
setHeader
(
"Authorization"
,
"Taosd "
+
token
);
method
.
setEntity
(
new
StringEntity
(
data
,
Charset
.
forName
(
"UTF-8"
)
));
method
.
setEntity
(
new
StringEntity
(
data
,
StandardCharsets
.
UTF_8
));
HttpContext
context
=
HttpClientContext
.
create
();
CloseableHttpResponse
httpResponse
=
httpClient
.
execute
(
method
,
context
);
httpEntity
=
httpResponse
.
getEntity
();
...
...
@@ -165,28 +164,18 @@ public class HttpClientPoolUtil {
httpEntity
=
httpResponse
.
getEntity
();
if
(
httpEntity
!=
null
)
{
responseBody
=
EntityUtils
.
toString
(
httpEntity
,
"UTF-8"
);
// logger.info("请求URL: " + uri + "+ 返回状态码:" + httpResponse.getStatusLine().getStatusCode());
}
}
catch
(
Exception
e
)
{
if
(
method
!=
null
)
{
method
.
abort
();
}
e
.
printStackTrace
();
// logger.error("execute get request exception, url:" + uri + ", exception:" + e.toString() + ",cost time(ms):"
// + (System.currentTimeMillis() - startTime));
System
.
out
.
println
(
"log:调用 HttpClientPoolUtil execute get request exception, url:"
+
uri
+
", exception:"
+
e
.
toString
()
+
",cost time(ms):"
+
(
System
.
currentTimeMillis
()
-
startTime
));
}
finally
{
if
(
httpEntity
!=
null
)
{
try
{
EntityUtils
.
consumeQuietly
(
httpEntity
);
}
catch
(
Exception
e
)
{
// e.printStackTrace();
// logger.error("close response exception, url:" + uri + ", exception:" + e.toString()
// + ",cost time(ms):" + (System.currentTimeMillis() - startTime));
new
Exception
(
"close response exception, url:"
+
uri
+
", exception:"
+
e
.
toString
()
+
",cost time(ms):"
+
(
System
.
currentTimeMillis
()
-
startTime
))
.
printStackTrace
();
new
Exception
(
"close response exception, url:"
+
uri
+
", exception:"
+
e
.
toString
()
+
",cost time(ms):"
+
(
System
.
currentTimeMillis
()
-
startTime
)).
printStackTrace
();
}
}
}
...
...
src/connector/jdbc/src/main/java/com/taosdata/jdbc/utils/Utils.java
浏览文件 @
55757e16
...
...
@@ -3,14 +3,13 @@ package com.taosdata.jdbc.utils;
import
com.google.common.collect.Range
;
import
com.google.common.collect.RangeSet
;
import
com.google.common.collect.TreeRangeSet
;
import
com.taosdata.jdbc.enums.TimestampPrecision
;
import
java.nio.charset.Charset
;
import
java.sql.Date
;
import
java.sql.Time
;
import
java.sql.Timestamp
;
import
java.time.LocalDate
;
import
java.time.LocalDateTime
;
import
java.time.LocalTime
;
import
java.time.format.DateTimeFormatter
;
import
java.time.format.DateTimeFormatterBuilder
;
import
java.time.format.DateTimeParseException
;
...
...
@@ -25,39 +24,52 @@ public class Utils {
private
static
Pattern
ptn
=
Pattern
.
compile
(
".*?'"
);
private
static
final
DateTimeFormatter
formatter
=
new
DateTimeFormatterBuilder
()
.
appendPattern
(
"yyyy-MM-dd HH:mm:ss.SSS"
).
toFormatter
();
private
static
final
DateTimeFormatter
formatter2
=
new
DateTimeFormatterBuilder
()
.
appendPattern
(
"yyyy-MM-dd HH:mm:ss.SSSSSS"
).
toFormatter
();
private
static
final
DateTimeFormatter
milliSecFormatter
=
new
DateTimeFormatterBuilder
().
appendPattern
(
"yyyy-MM-dd HH:mm:ss.SSS"
).
toFormatter
();
private
static
final
DateTimeFormatter
microSecFormatter
=
new
DateTimeFormatterBuilder
().
appendPattern
(
"yyyy-MM-dd HH:mm:ss.SSSSSS"
).
toFormatter
();
private
static
final
DateTimeFormatter
nanoSecFormatter
=
new
DateTimeFormatterBuilder
().
appendPattern
(
"yyyy-MM-dd HH:mm:ss.SSSSSSSSS"
).
toFormatter
();
public
static
Time
parseTime
(
String
timestampStr
)
throws
DateTimeParseException
{
LocalTime
time
;
try
{
time
=
LocalTime
.
parse
(
timestampStr
,
formatter
);
}
catch
(
DateTimeParseException
e
)
{
time
=
LocalTime
.
parse
(
timestampStr
,
formatter2
);
}
return
Time
.
valueOf
(
time
);
LocalDateTime
dateTime
=
parseLocalDateTime
(
timestampStr
);
return
dateTime
!=
null
?
Time
.
valueOf
(
dateTime
.
toLocalTime
())
:
null
;
}
public
static
Date
parseDate
(
String
timestampStr
)
throws
DateTimeParseException
{
LocalDate
date
;
try
{
date
=
LocalDate
.
parse
(
timestampStr
,
formatter
);
}
catch
(
DateTimeParseException
e
)
{
date
=
LocalDate
.
parse
(
timestampStr
,
formatter2
);
}
return
Date
.
valueOf
(
date
);
public
static
Date
parseDate
(
String
timestampStr
)
{
LocalDateTime
dateTime
=
parseLocalDateTime
(
timestampStr
);
return
dateTime
!=
null
?
Date
.
valueOf
(
String
.
valueOf
(
dateTime
))
:
null
;
}
public
static
Timestamp
parseTimestamp
(
String
timeStampStr
)
{
LocalDateTime
dateTime
;
LocalDateTime
dateTime
=
parseLocalDateTime
(
timeStampStr
);
return
dateTime
!=
null
?
Timestamp
.
valueOf
(
dateTime
)
:
null
;
}
private
static
LocalDateTime
parseLocalDateTime
(
String
timeStampStr
)
{
try
{
dateTime
=
LocalDateTime
.
parse
(
timeStampStr
,
formatte
r
);
return
parseMilliSecTimestamp
(
timeStampSt
r
);
}
catch
(
DateTimeParseException
e
)
{
dateTime
=
LocalDateTime
.
parse
(
timeStampStr
,
formatter2
);
try
{
return
parseMicroSecTimestamp
(
timeStampStr
);
}
catch
(
DateTimeParseException
ee
)
{
try
{
return
parseNanoSecTimestamp
(
timeStampStr
);
}
catch
(
DateTimeParseException
eee
)
{
eee
.
printStackTrace
();
}
}
}
return
Timestamp
.
valueOf
(
dateTime
);
return
null
;
}
private
static
LocalDateTime
parseMilliSecTimestamp
(
String
timeStampStr
)
throws
DateTimeParseException
{
return
LocalDateTime
.
parse
(
timeStampStr
,
milliSecFormatter
);
}
private
static
LocalDateTime
parseMicroSecTimestamp
(
String
timeStampStr
)
throws
DateTimeParseException
{
return
LocalDateTime
.
parse
(
timeStampStr
,
microSecFormatter
);
}
private
static
LocalDateTime
parseNanoSecTimestamp
(
String
timeStampStr
)
throws
DateTimeParseException
{
return
LocalDateTime
.
parse
(
timeStampStr
,
nanoSecFormatter
);
}
public
static
String
escapeSingleQuota
(
String
origin
)
{
...
...
@@ -93,6 +105,8 @@ public class Utils {
}
public
static
String
getNativeSql
(
String
rawSql
,
Object
[]
parameters
)
{
if
(
parameters
==
null
||
!
rawSql
.
contains
(
"?"
))
return
rawSql
;
// toLowerCase
String
preparedSql
=
rawSql
.
trim
().
toLowerCase
();
String
[]
clause
=
new
String
[]{
"values\\s*\\(.*?\\)"
,
"tags\\s*\\(.*?\\)"
,
"where\\s*.*"
};
...
...
@@ -167,13 +181,47 @@ public class Utils {
}).
collect
(
Collectors
.
joining
());
}
public
static
String
formatTimestamp
(
Timestamp
timestamp
)
{
int
nanos
=
timestamp
.
getNanos
();
if
(
nanos
%
1000000
l
!=
0
)
return
timestamp
.
toLocalDateTime
().
format
(
formatter2
);
return
timestamp
.
toLocalDateTime
().
format
(
formatter
);
return
timestamp
.
toLocalDateTime
().
format
(
microSecFormatter
);
return
timestamp
.
toLocalDateTime
().
format
(
milliSecFormatter
);
}
public
static
TimestampPrecision
guessTimestampPrecision
(
String
value
)
{
if
(
isMilliSecFormat
(
value
))
return
TimestampPrecision
.
MS
;
if
(
isMicroSecFormat
(
value
))
return
TimestampPrecision
.
US
;
if
(
isNanoSecFormat
(
value
))
return
TimestampPrecision
.
NS
;
return
TimestampPrecision
.
UNKNOWN
;
}
private
static
boolean
isMilliSecFormat
(
String
timestampStr
)
{
try
{
milliSecFormatter
.
parse
(
timestampStr
);
}
catch
(
DateTimeParseException
e
)
{
return
false
;
}
return
true
;
}
private
static
boolean
isMicroSecFormat
(
String
timestampStr
)
{
try
{
microSecFormatter
.
parse
(
timestampStr
);
}
catch
(
DateTimeParseException
e
)
{
return
false
;
}
return
true
;
}
private
static
boolean
isNanoSecFormat
(
String
timestampStr
)
{
try
{
nanoSecFormatter
.
parse
(
timestampStr
);
}
catch
(
DateTimeParseException
e
)
{
return
false
;
}
return
true
;
}
}
src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBJNIConnectorTest.java
浏览文件 @
55757e16
package
com.taosdata.jdbc
;
import
org.junit.Test
;
import
static
org
.
junit
.
Assert
.*;
import
java.sql.SQLException
;
import
java.sql.SQLWarning
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.lang.management.ManagementFactory
;
import
java.lang.management.RuntimeMXBean
;
import
java.lang.management.ThreadMXBean
;
public
class
TSDBJNIConnectorTest
{
private
static
TSDBResultSetRowData
rowData
;
...
...
@@ -14,17 +19,68 @@ public class TSDBJNIConnectorTest {
@Test
public
void
test
()
{
try
{
try
{
//change sleepSeconds when debugging with attach to process to find PID
int
sleepSeconds
=
-
1
;
if
(
sleepSeconds
>
0
)
{
RuntimeMXBean
runtimeBean
=
ManagementFactory
.
getRuntimeMXBean
();
String
jvmName
=
runtimeBean
.
getName
();
long
pid
=
Long
.
valueOf
(
jvmName
.
split
(
"@"
)[
0
]);
System
.
out
.
println
(
"JVM PID = "
+
pid
);
Thread
.
sleep
(
sleepSeconds
*
1000
);
}
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
// init
TSDBJNIConnector
.
init
(
"/etc/taos/taos.cfg"
,
null
,
null
,
null
);
TSDBJNIConnector
.
init
(
"/etc/taos"
,
null
,
null
,
null
);
// connect
TSDBJNIConnector
connector
=
new
TSDBJNIConnector
();
connector
.
connect
(
"127.0.0.1"
,
6030
,
"unsign_jni"
,
"root"
,
"taosdata"
);
connector
.
connect
(
"127.0.0.1"
,
6030
,
null
,
"root"
,
"taosdata"
);
// setup
String
setupSqlStrs
[]
=
{
"create database if not exists d precision \"us\""
,
"create table if not exists d.t(ts timestamp, f int)"
,
"create database if not exists d2"
,
"create table if not exists d2.t2(ts timestamp, f int)"
,
"insert into d.t values(now+100s, 100)"
,
"insert into d2.t2 values(now+200s, 200)"
};
for
(
String
setupSqlStr
:
setupSqlStrs
)
{
long
setupSql
=
connector
.
executeQuery
(
setupSqlStr
);
assertEquals
(
0
,
connector
.
getResultTimePrecision
(
setupSql
));
if
(
connector
.
isUpdateQuery
(
setupSql
))
{
connector
.
freeResultSet
(
setupSql
);
}
}
{
long
sqlObj1
=
connector
.
executeQuery
(
"select * from d2.t2"
);
assertEquals
(
0
,
connector
.
getResultTimePrecision
(
sqlObj1
));
List
<
ColumnMetaData
>
columnMetaDataList
=
new
ArrayList
<>();
int
code
=
connector
.
getSchemaMetaData
(
sqlObj1
,
columnMetaDataList
);
rowData
=
new
TSDBResultSetRowData
(
columnMetaDataList
.
size
());
assertTrue
(
next
(
connector
,
sqlObj1
));
assertEquals
(
0
,
connector
.
getResultTimePrecision
(
sqlObj1
));
connector
.
freeResultSet
(
sqlObj1
);
}
// executeQuery
long
pSql
=
connector
.
executeQuery
(
"select * from unsign_jni.us_table"
);
long
pSql
=
connector
.
executeQuery
(
"select * from d.t"
);
if
(
connector
.
isUpdateQuery
(
pSql
))
{
connector
.
freeResultSet
(
pSql
);
throw
TSDBError
.
createSQLException
(
TSDBErrorNumbers
.
ERROR_INVALID_WITH_EXECUTEQUERY
);
}
assertEquals
(
1
,
connector
.
getResultTimePrecision
(
pSql
));
// get schema
List
<
ColumnMetaData
>
columnMetaDataList
=
new
ArrayList
<>();
int
code
=
connector
.
getSchemaMetaData
(
pSql
,
columnMetaDataList
);
...
...
@@ -37,6 +93,8 @@ public class TSDBJNIConnectorTest {
if
(
code
==
TSDBConstants
.
JNI_NUM_OF_FIELDS_0
)
{
throw
TSDBError
.
createSQLException
(
TSDBErrorNumbers
.
ERROR_JNI_NUM_OF_FIELDS_0
);
}
assertEquals
(
1
,
connector
.
getResultTimePrecision
(
pSql
));
int
columnSize
=
columnMetaDataList
.
size
();
// print metadata
for
(
int
i
=
0
;
i
<
columnSize
;
i
++)
{
...
...
@@ -45,9 +103,8 @@ public class TSDBJNIConnectorTest {
rowData
=
new
TSDBResultSetRowData
(
columnSize
);
// iterate resultSet
for
(
int
i
=
0
;
next
(
connector
,
pSql
);
i
++)
{
// System.out.println("col[" + i + "] size: " + rowData.getColSize());
// rowData.getData().stream().forEach(col -> System.out.print(col + "\t"));
// System.out.println();
assertEquals
(
1
,
connector
.
getResultTimePrecision
(
pSql
));
System
.
out
.
println
();
}
// close resultSet
code
=
connector
.
freeResultSet
(
pSql
);
...
...
@@ -86,4 +143,4 @@ public class TSDBJNIConnectorTest {
}
}
}
\ No newline at end of file
}
src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBPreparedStatementTest.java
浏览文件 @
55757e16
...
...
@@ -5,7 +5,6 @@ import org.junit.*;
import
java.io.IOException
;
import
java.math.BigDecimal
;
import
java.sql.*
;
import
java.time.LocalTime
;
import
java.util.ArrayList
;
import
java.util.Random
;
...
...
@@ -15,6 +14,7 @@ public class TSDBPreparedStatementTest {
private
static
Connection
conn
;
private
static
final
String
sql_insert
=
"insert into t1 values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
;
private
static
final
String
sql_select
=
"select * from t1 where ts >= ? and ts < ? and f1 >= ?"
;
private
static
final
String
dbname
=
"test_pstmt_jni"
;
private
PreparedStatement
pstmt_insert
;
private
PreparedStatement
pstmt_select
;
...
...
@@ -299,53 +299,53 @@ public class TSDBPreparedStatementTest {
}
@Test
public
void
executeTest
()
throws
SQLException
{
Statement
stmt
=
conn
.
createStatement
();
public
void
executeTest
()
throws
SQLException
{
Statement
stmt
=
conn
.
createStatement
();
int
numOfRows
=
1000
;
int
numOfRows
=
1000
;
for
(
int
loop
=
0
;
loop
<
10
;
loop
++){
for
(
int
loop
=
0
;
loop
<
10
;
loop
++)
{
stmt
.
execute
(
"drop table if exists weather_test"
);
stmt
.
execute
(
"create table weather_test(ts timestamp, f1 nchar(4), f2 float, f3 double, f4 timestamp, f5 int, f6 bool, f7 binary(10))"
);
stmt
.
execute
(
"create table weather_test(ts timestamp, f1 nchar(4), f2 float, f3 double, f4 timestamp, f5 int, f6 bool, f7 binary(10))"
);
TSDBPreparedStatement
s
=
(
TSDBPreparedStatement
)
conn
.
prepareStatement
(
"insert into ? values(?, ?, ?, ?, ?, ?, ?, ?)"
);
Random
r
=
new
Random
();
s
.
setTableName
(
"weather_test"
);
ArrayList
<
Long
>
ts
=
new
ArrayList
<
Long
>();
for
(
int
i
=
0
;
i
<
numOfRows
;
i
++)
{
for
(
int
i
=
0
;
i
<
numOfRows
;
i
++)
{
ts
.
add
(
System
.
currentTimeMillis
()
+
i
);
}
}
s
.
setTimestamp
(
0
,
ts
);
int
random
=
10
+
r
.
nextInt
(
5
);
ArrayList
<
String
>
s2
=
new
ArrayList
<
String
>();
for
(
int
i
=
0
;
i
<
numOfRows
;
i
++)
{
if
(
i
%
random
==
0
)
{
ArrayList
<
String
>
s2
=
new
ArrayList
<
String
>();
for
(
int
i
=
0
;
i
<
numOfRows
;
i
++)
{
if
(
i
%
random
==
0
)
{
s2
.
add
(
null
);
}
else
{
}
else
{
s2
.
add
(
"分支"
+
i
%
4
);
}
}
s
.
setNString
(
1
,
s2
,
4
);
}
s
.
setNString
(
1
,
s2
,
4
);
random
=
10
+
r
.
nextInt
(
5
);
ArrayList
<
Float
>
s3
=
new
ArrayList
<
Float
>();
for
(
int
i
=
0
;
i
<
numOfRows
;
i
++)
{
if
(
i
%
random
==
0
)
{
ArrayList
<
Float
>
s3
=
new
ArrayList
<
Float
>();
for
(
int
i
=
0
;
i
<
numOfRows
;
i
++)
{
if
(
i
%
random
==
0
)
{
s3
.
add
(
null
);
}
else
{
}
else
{
s3
.
add
(
r
.
nextFloat
());
}
}
}
s
.
setFloat
(
2
,
s3
);
random
=
10
+
r
.
nextInt
(
5
);
ArrayList
<
Double
>
s4
=
new
ArrayList
<
Double
>();
for
(
int
i
=
0
;
i
<
numOfRows
;
i
++)
{
if
(
i
%
random
==
0
)
{
for
(
int
i
=
0
;
i
<
numOfRows
;
i
++)
{
if
(
i
%
random
==
0
)
{
s4
.
add
(
null
);
}
else
{
}
else
{
s4
.
add
(
r
.
nextDouble
());
}
}
...
...
@@ -353,47 +353,47 @@ public class TSDBPreparedStatementTest {
random
=
10
+
r
.
nextInt
(
5
);
ArrayList
<
Long
>
ts2
=
new
ArrayList
<
Long
>();
for
(
int
i
=
0
;
i
<
numOfRows
;
i
++)
{
if
(
i
%
random
==
0
)
{
for
(
int
i
=
0
;
i
<
numOfRows
;
i
++)
{
if
(
i
%
random
==
0
)
{
ts2
.
add
(
null
);
}
else
{
}
else
{
ts2
.
add
(
System
.
currentTimeMillis
()
+
i
);
}
}
s
.
setTimestamp
(
4
,
ts2
);
random
=
10
+
r
.
nextInt
(
5
);
ArrayList
<
Integer
>
vals
=
new
ArrayList
<>();
for
(
int
i
=
0
;
i
<
numOfRows
;
i
++)
{
if
(
i
%
random
==
0
)
{
ArrayList
<
Integer
>
vals
=
new
ArrayList
<>();
for
(
int
i
=
0
;
i
<
numOfRows
;
i
++)
{
if
(
i
%
random
==
0
)
{
vals
.
add
(
null
);
}
else
{
}
else
{
vals
.
add
(
r
.
nextInt
());
}
}
}
s
.
setInt
(
5
,
vals
);
random
=
10
+
r
.
nextInt
(
5
);
ArrayList
<
Boolean
>
sb
=
new
ArrayList
<>();
for
(
int
i
=
0
;
i
<
numOfRows
;
i
++)
{
if
(
i
%
random
==
0
)
{
for
(
int
i
=
0
;
i
<
numOfRows
;
i
++)
{
if
(
i
%
random
==
0
)
{
sb
.
add
(
null
);
}
else
{
}
else
{
sb
.
add
(
i
%
2
==
0
?
true
:
false
);
}
}
s
.
setBoolean
(
6
,
sb
);
s
.
setBoolean
(
6
,
sb
);
random
=
10
+
r
.
nextInt
(
5
);
ArrayList
<
String
>
s5
=
new
ArrayList
<
String
>();
for
(
int
i
=
0
;
i
<
numOfRows
;
i
++)
{
if
(
i
%
random
==
0
)
{
for
(
int
i
=
0
;
i
<
numOfRows
;
i
++)
{
if
(
i
%
random
==
0
)
{
s5
.
add
(
null
);
}
else
{
}
else
{
s5
.
add
(
"test"
+
i
%
10
);
}
}
s
.
setString
(
7
,
s5
,
10
);
s
.
setString
(
7
,
s5
,
10
);
s
.
columnDataAddBatch
();
s
.
columnDataExecuteBatch
();
...
...
@@ -403,54 +403,54 @@ public class TSDBPreparedStatementTest {
PreparedStatement
statement
=
conn
.
prepareStatement
(
sql
);
ResultSet
rs
=
statement
.
executeQuery
();
int
rows
=
0
;
while
(
rs
.
next
())
{
while
(
rs
.
next
())
{
rows
++;
}
Assert
.
assertEquals
(
numOfRows
,
rows
);
Assert
.
assertEquals
(
numOfRows
,
rows
);
}
}
@Test
public
void
bindDataSelectColumnTest
()
throws
SQLException
{
Statement
stmt
=
conn
.
createStatement
();
public
void
bindDataSelectColumnTest
()
throws
SQLException
{
Statement
stmt
=
conn
.
createStatement
();
int
numOfRows
=
1000
;
int
numOfRows
=
1000
;
for
(
int
loop
=
0
;
loop
<
10
;
loop
++){
for
(
int
loop
=
0
;
loop
<
10
;
loop
++)
{
stmt
.
execute
(
"drop table if exists weather_test"
);
stmt
.
execute
(
"create table weather_test(ts timestamp, f1 nchar(4), f2 float, f3 double, f4 timestamp, f5 int, f6 bool, f7 binary(10))"
);
stmt
.
execute
(
"create table weather_test(ts timestamp, f1 nchar(4), f2 float, f3 double, f4 timestamp, f5 int, f6 bool, f7 binary(10))"
);
TSDBPreparedStatement
s
=
(
TSDBPreparedStatement
)
conn
.
prepareStatement
(
"insert into ? (ts, f1, f7) values(?, ?, ?)"
);
Random
r
=
new
Random
();
s
.
setTableName
(
"weather_test"
);
ArrayList
<
Long
>
ts
=
new
ArrayList
<
Long
>();
for
(
int
i
=
0
;
i
<
numOfRows
;
i
++)
{
for
(
int
i
=
0
;
i
<
numOfRows
;
i
++)
{
ts
.
add
(
System
.
currentTimeMillis
()
+
i
);
}
}
s
.
setTimestamp
(
0
,
ts
);
int
random
=
10
+
r
.
nextInt
(
5
);
ArrayList
<
String
>
s2
=
new
ArrayList
<
String
>();
for
(
int
i
=
0
;
i
<
numOfRows
;
i
++)
{
if
(
i
%
random
==
0
)
{
ArrayList
<
String
>
s2
=
new
ArrayList
<
String
>();
for
(
int
i
=
0
;
i
<
numOfRows
;
i
++)
{
if
(
i
%
random
==
0
)
{
s2
.
add
(
null
);
}
else
{
}
else
{
s2
.
add
(
"分支"
+
i
%
4
);
}
}
s
.
setNString
(
1
,
s2
,
4
);
}
s
.
setNString
(
1
,
s2
,
4
);
random
=
10
+
r
.
nextInt
(
5
);
ArrayList
<
String
>
s3
=
new
ArrayList
<
String
>();
for
(
int
i
=
0
;
i
<
numOfRows
;
i
++)
{
if
(
i
%
random
==
0
)
{
for
(
int
i
=
0
;
i
<
numOfRows
;
i
++)
{
if
(
i
%
random
==
0
)
{
s3
.
add
(
null
);
}
else
{
}
else
{
s3
.
add
(
"test"
+
i
%
10
);
}
}
s
.
setString
(
2
,
s3
,
10
);
s
.
setString
(
2
,
s3
,
10
);
s
.
columnDataAddBatch
();
s
.
columnDataExecuteBatch
();
...
...
@@ -460,30 +460,30 @@ public class TSDBPreparedStatementTest {
PreparedStatement
statement
=
conn
.
prepareStatement
(
sql
);
ResultSet
rs
=
statement
.
executeQuery
();
int
rows
=
0
;
while
(
rs
.
next
())
{
while
(
rs
.
next
())
{
rows
++;
}
Assert
.
assertEquals
(
numOfRows
,
rows
);
Assert
.
assertEquals
(
numOfRows
,
rows
);
}
}
@Test
public
void
bindDataWithSingleTagTest
()
throws
SQLException
{
Statement
stmt
=
conn
.
createStatement
();
public
void
bindDataWithSingleTagTest
()
throws
SQLException
{
Statement
stmt
=
conn
.
createStatement
();
String
types
[]
=
new
String
[]
{
"tinyint"
,
"smallint"
,
"int"
,
"bigint"
,
"bool"
,
"float"
,
"double"
,
"binary(10)"
,
"nchar(10)"
};
String
types
[]
=
new
String
[]
{
"tinyint"
,
"smallint"
,
"int"
,
"bigint"
,
"bool"
,
"float"
,
"double"
,
"binary(10)"
,
"nchar(10)"
};
for
(
String
type
:
types
)
{
stmt
.
execute
(
"drop table if exists weather_test"
);
stmt
.
execute
(
"create table weather_test(ts timestamp, f1 nchar(10), f2 binary(10)) tags (t "
+
type
+
")"
);
int
numOfRows
=
1
;
TSDBPreparedStatement
s
=
(
TSDBPreparedStatement
)
conn
.
prepareStatement
(
"insert into ? using weather_test tags(?) values(?, ?, ?)"
);
Random
r
=
new
Random
();
s
.
setTableName
(
"w1"
);
switch
(
type
)
{
switch
(
type
)
{
case
"tinyint"
:
case
"smallint"
:
case
"int"
:
...
...
@@ -508,37 +508,37 @@ public class TSDBPreparedStatementTest {
default
:
break
;
}
ArrayList
<
Long
>
ts
=
new
ArrayList
<
Long
>();
for
(
int
i
=
0
;
i
<
numOfRows
;
i
++)
{
for
(
int
i
=
0
;
i
<
numOfRows
;
i
++)
{
ts
.
add
(
System
.
currentTimeMillis
()
+
i
);
}
}
s
.
setTimestamp
(
0
,
ts
);
int
random
=
10
+
r
.
nextInt
(
5
);
ArrayList
<
String
>
s2
=
new
ArrayList
<
String
>();
for
(
int
i
=
0
;
i
<
numOfRows
;
i
++)
{
s2
.
add
(
"分支"
+
i
%
4
);
}
ArrayList
<
String
>
s2
=
new
ArrayList
<
String
>();
for
(
int
i
=
0
;
i
<
numOfRows
;
i
++)
{
s2
.
add
(
"分支"
+
i
%
4
);
}
s
.
setNString
(
1
,
s2
,
10
);
random
=
10
+
r
.
nextInt
(
5
);
ArrayList
<
String
>
s3
=
new
ArrayList
<
String
>();
for
(
int
i
=
0
;
i
<
numOfRows
;
i
++)
{
s3
.
add
(
"test"
+
i
%
4
);
}
ArrayList
<
String
>
s3
=
new
ArrayList
<
String
>();
for
(
int
i
=
0
;
i
<
numOfRows
;
i
++)
{
s3
.
add
(
"test"
+
i
%
4
);
}
s
.
setString
(
2
,
s3
,
10
);
s
.
columnDataAddBatch
();
s
.
columnDataExecuteBatch
();
s
.
columnDataCloseBatch
();
String
sql
=
"select * from weather_test"
;
PreparedStatement
statement
=
conn
.
prepareStatement
(
sql
);
ResultSet
rs
=
statement
.
executeQuery
();
int
rows
=
0
;
while
(
rs
.
next
())
{
while
(
rs
.
next
())
{
rows
++;
}
Assert
.
assertEquals
(
numOfRows
,
rows
);
...
...
@@ -547,32 +547,32 @@ public class TSDBPreparedStatementTest {
@Test
public
void
bindDataWithMultipleTagsTest
()
throws
SQLException
{
Statement
stmt
=
conn
.
createStatement
();
public
void
bindDataWithMultipleTagsTest
()
throws
SQLException
{
Statement
stmt
=
conn
.
createStatement
();
stmt
.
execute
(
"drop table if exists weather_test"
);
stmt
.
execute
(
"create table weather_test(ts timestamp, f1 nchar(10), f2 binary(10)) tags (t1 int, t2 binary(10))"
);
int
numOfRows
=
1
;
TSDBPreparedStatement
s
=
(
TSDBPreparedStatement
)
conn
.
prepareStatement
(
"insert into ? using weather_test tags(?,?) (ts, f2) values(?, ?)"
);
s
.
setTableName
(
"w2"
);
TSDBPreparedStatement
s
=
(
TSDBPreparedStatement
)
conn
.
prepareStatement
(
"insert into ? using weather_test tags(?,?) (ts, f2) values(?, ?)"
);
s
.
setTableName
(
"w2"
);
s
.
setTagInt
(
0
,
1
);
s
.
setTagString
(
1
,
"test"
);
ArrayList
<
Long
>
ts
=
new
ArrayList
<
Long
>();
for
(
int
i
=
0
;
i
<
numOfRows
;
i
++)
{
for
(
int
i
=
0
;
i
<
numOfRows
;
i
++)
{
ts
.
add
(
System
.
currentTimeMillis
()
+
i
);
}
}
s
.
setTimestamp
(
0
,
ts
);
ArrayList
<
String
>
s2
=
new
ArrayList
<
String
>();
for
(
int
i
=
0
;
i
<
numOfRows
;
i
++)
{
ArrayList
<
String
>
s2
=
new
ArrayList
<
String
>();
for
(
int
i
=
0
;
i
<
numOfRows
;
i
++)
{
s2
.
add
(
"test"
+
i
%
4
);
}
s
.
setString
(
1
,
s2
,
10
);
s
.
columnDataAddBatch
();
s
.
columnDataExecuteBatch
();
s
.
columnDataCloseBatch
();
...
...
@@ -581,21 +581,20 @@ public class TSDBPreparedStatementTest {
PreparedStatement
statement
=
conn
.
prepareStatement
(
sql
);
ResultSet
rs
=
statement
.
executeQuery
();
int
rows
=
0
;
while
(
rs
.
next
())
{
while
(
rs
.
next
())
{
rows
++;
}
Assert
.
assertEquals
(
numOfRows
,
rows
);
}
@Test
@Test
(
expected
=
SQLException
.
class
)
public
void
createTwoSameDbTest
()
throws
SQLException
{
Statement
stmt
=
conn
.
createStatement
();
// when
Statement
stmt
=
conn
.
createStatement
();
stmt
.
execute
(
"create database dbtest"
);
stmt
.
execute
(
"create database dbtest"
);
Assert
.
assertThrows
(
SQLException
.
class
,
()
->
stmt
.
execute
(
"create database dbtest"
));
}
@Test
public
void
setBoolean
()
throws
SQLException
{
// given
...
...
@@ -1097,9 +1096,9 @@ public class TSDBPreparedStatementTest {
try
{
conn
=
DriverManager
.
getConnection
(
"jdbc:TAOS://"
+
host
+
":6030/?user=root&password=taosdata"
);
try
(
Statement
stmt
=
conn
.
createStatement
())
{
stmt
.
execute
(
"drop database if exists
test_pstmt_jni"
);
stmt
.
execute
(
"create database if not exists
test_pstmt_jni"
);
stmt
.
execute
(
"use
test_pstmt_jni"
);
stmt
.
execute
(
"drop database if exists
"
+
dbname
);
stmt
.
execute
(
"create database if not exists
"
+
dbname
);
stmt
.
execute
(
"use
"
+
dbname
);
}
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
();
...
...
@@ -1109,6 +1108,9 @@ public class TSDBPreparedStatementTest {
@AfterClass
public
static
void
afterClass
()
{
try
{
Statement
statement
=
conn
.
createStatement
();
statement
.
execute
(
"drop database if exists "
+
dbname
);
statement
.
close
();
if
(
conn
!=
null
)
conn
.
close
();
}
catch
(
SQLException
e
)
{
...
...
src/connector/jdbc/src/test/java/com/taosdata/jdbc/cases/
TD4174
Test.java
→
src/connector/jdbc/src/test/java/com/taosdata/jdbc/cases/
DoubleQuoteInSql
Test.java
浏览文件 @
55757e16
...
...
@@ -7,56 +7,64 @@ import org.junit.*;
import
java.sql.*
;
import
java.util.Properties
;
public
class
TD4174Test
{
private
Connection
conn
;
public
class
DoubleQuoteInSqlTest
{
private
static
final
String
host
=
"127.0.0.1"
;
private
static
final
String
dbname
=
"td4174"
;
private
Connection
conn
;
@Test
public
void
test
()
{
// given
long
ts
=
System
.
currentTimeMillis
();
JSONObject
value
=
new
JSONObject
();
value
.
put
(
"name"
,
"John Smith"
);
value
.
put
(
"age"
,
20
);
// when
int
ret
=
0
;
try
(
PreparedStatement
pstmt
=
conn
.
prepareStatement
(
"insert into weather values("
+
ts
+
", ?)"
))
{
JSONObject
value
=
new
JSONObject
();
value
.
put
(
"name"
,
"John Smith"
);
value
.
put
(
"age"
,
20
);
Assert
.
assertEquals
(
"{\"name\":\"John Smith\",\"age\":20}"
,
value
.
toJSONString
());
pstmt
.
setString
(
1
,
value
.
toJSONString
());
int
ret
=
pstmt
.
executeUpdate
();
Assert
.
assertEquals
(
1
,
ret
);
ret
=
pstmt
.
executeUpdate
();
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
();
}
}
public
static
void
main
(
String
[]
args
)
{
JSONObject
value
=
new
JSONObject
();
value
.
put
(
"name"
,
"John Smith"
);
value
.
put
(
"age"
,
20
);
System
.
out
.
println
(
value
.
toJSONString
());
// then
Assert
.
assertEquals
(
"{\"name\":\"John Smith\",\"age\":20}"
,
value
.
toJSONString
());
Assert
.
assertEquals
(
1
,
ret
);
}
@Before
public
void
before
()
throws
SQLException
{
public
void
before
()
{
String
url
=
"jdbc:TAOS://"
+
host
+
":6030/?user=root&password=taosdata"
;
Properties
properties
=
new
Properties
();
properties
.
setProperty
(
TSDBDriver
.
PROPERTY_KEY_CHARSET
,
"UTF-8"
);
properties
.
setProperty
(
TSDBDriver
.
PROPERTY_KEY_LOCALE
,
"en_US.UTF-8"
);
properties
.
setProperty
(
TSDBDriver
.
PROPERTY_KEY_TIME_ZONE
,
"UTC-8"
);
conn
=
DriverManager
.
getConnection
(
url
,
properties
);
try
(
Statement
stmt
=
conn
.
createStatement
())
{
stmt
.
execute
(
"drop database if exists td4174"
);
stmt
.
execute
(
"create database if not exists td4174"
);
stmt
.
execute
(
"use td4174"
);
try
{
conn
=
DriverManager
.
getConnection
(
url
,
properties
);
Statement
stmt
=
conn
.
createStatement
();
stmt
.
execute
(
"drop database if exists "
+
dbname
);
stmt
.
execute
(
"create database if not exists "
+
dbname
);
stmt
.
execute
(
"use "
+
dbname
);
stmt
.
execute
(
"create table weather(ts timestamp, text binary(64))"
);
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
();
}
}
@After
public
void
after
()
throws
SQLException
{
if
(
conn
!=
null
)
public
void
after
()
{
try
{
Statement
stmt
=
conn
.
createStatement
();
stmt
.
execute
(
"drop database if exists "
+
dbname
);
stmt
.
close
();
conn
.
close
();
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
();
}
}
}
src/connector/jdbc/src/test/java/com/taosdata/jdbc/cases/
TwoTypeTimestampPercisionInJni
Test.java
→
src/connector/jdbc/src/test/java/com/taosdata/jdbc/cases/
MicroSecondPrecisionJNI
Test.java
浏览文件 @
55757e16
...
...
@@ -10,7 +10,7 @@ import org.junit.Test;
import
java.sql.*
;
import
java.util.Properties
;
public
class
TwoTypeTimestampPercisionInJni
Test
{
public
class
MicroSecondPrecisionJNI
Test
{
private
static
final
String
host
=
"127.0.0.1"
;
private
static
final
String
ms_timestamp_db
=
"ms_precision_test"
;
...
...
src/connector/jdbc/src/test/java/com/taosdata/jdbc/cases/
TwoTypeTimestampPercisionI
nRestfulTest.java
→
src/connector/jdbc/src/test/java/com/taosdata/jdbc/cases/
MicroSecondPrecisio
nRestfulTest.java
浏览文件 @
55757e16
...
...
@@ -10,10 +10,9 @@ import org.junit.Test;
import
java.sql.*
;
import
java.util.Properties
;
public
class
TwoTypeTimestampPercisionI
nRestfulTest
{
public
class
MicroSecondPrecisio
nRestfulTest
{
private
static
final
String
host
=
"127.0.0.1"
;
private
static
final
String
ms_timestamp_db
=
"ms_precision_test"
;
private
static
final
String
us_timestamp_db
=
"us_precision_test"
;
private
static
final
long
timestamp1
=
System
.
currentTimeMillis
();
...
...
src/connector/jdbc/src/test/java/com/taosdata/jdbc/cases/NanoSecondTimestampJNITest.java
0 → 100644
浏览文件 @
55757e16
package
com.taosdata.jdbc.cases
;
import
org.junit.Assert
;
import
org.junit.Before
;
import
org.junit.BeforeClass
;
import
org.junit.Test
;
import
java.sql.*
;
import
java.time.Instant
;
import
java.util.Random
;
public
class
NanoSecondTimestampJNITest
{
private
static
final
String
host
=
"127.0.0.1"
;
private
static
final
String
dbname
=
"nano_sec_test"
;
private
static
final
Random
random
=
new
Random
(
System
.
currentTimeMillis
());
private
static
Connection
conn
;
@Test
public
void
insertUsingLongValue
()
{
// given
long
ms
=
System
.
currentTimeMillis
();
long
ns
=
ms
*
1000_000
+
random
.
nextInt
(
1000_000
);
// when
int
ret
=
0
;
try
(
Statement
stmt
=
conn
.
createStatement
())
{
ret
=
stmt
.
executeUpdate
(
"insert into weather(ts, temperature, humidity) values("
+
ns
+
", 12.3, 4)"
);
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
();
}
// then
Assert
.
assertEquals
(
1
,
ret
);
}
@Test
public
void
insertUsingStringValue
()
{
// given
// when
int
ret
=
0
;
try
(
Statement
stmt
=
conn
.
createStatement
())
{
ret
=
stmt
.
executeUpdate
(
"insert into weather(ts, temperature, humidity) values('2021-01-01 12:00:00.123456789', 12.3, 4)"
);
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
();
}
// then
Assert
.
assertEquals
(
1
,
ret
);
}
@Test
public
void
insertUsingTimestampValue
()
{
// given
long
epochSec
=
System
.
currentTimeMillis
()
/
1000
;
long
nanoAdjustment
=
random
.
nextInt
(
1000_000_000
);
Timestamp
ts
=
Timestamp
.
from
(
Instant
.
ofEpochSecond
(
epochSec
,
nanoAdjustment
));
// when
int
ret
=
0
;
String
sql
=
"insert into weather(ts, temperature, humidity) values( ?, ?, ?)"
;
try
(
PreparedStatement
pstmt
=
conn
.
prepareStatement
(
sql
))
{
pstmt
.
setTimestamp
(
1
,
ts
);
pstmt
.
setFloat
(
2
,
12.34f
);
pstmt
.
setInt
(
3
,
55
);
ret
=
pstmt
.
executeUpdate
();
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
();
}
// then
Assert
.
assertEquals
(
1
,
ret
);
}
@Test
public
void
selectUsingLongValue
()
throws
SQLException
{
// given
long
ms
=
System
.
currentTimeMillis
();
long
ns
=
ms
*
1000_000L
+
random
.
nextInt
(
1000_000
);
// when
ResultSet
rs
=
null
;
try
(
Statement
stmt
=
conn
.
createStatement
())
{
stmt
.
executeUpdate
(
"insert into weather(ts, temperature, humidity) values("
+
ns
+
", 12.3, 4)"
);
rs
=
stmt
.
executeQuery
(
"select * from weather"
);
rs
.
next
();
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
();
}
// then
long
actual
=
rs
.
getLong
(
1
);
Assert
.
assertEquals
(
ms
,
actual
);
actual
=
rs
.
getLong
(
"ts"
);
Assert
.
assertEquals
(
ms
,
actual
);
}
@Test
public
void
selectUsingStringValue
()
throws
SQLException
{
// given
String
timestampStr
=
"2021-01-01 12:00:00.123456789"
;
// when
ResultSet
rs
=
null
;
try
(
Statement
stmt
=
conn
.
createStatement
())
{
stmt
.
executeUpdate
(
"insert into weather(ts, temperature, humidity) values('"
+
timestampStr
+
"', 12.3, 4)"
);
rs
=
stmt
.
executeQuery
(
"select * from weather"
);
rs
.
next
();
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
();
}
// then
String
actual
=
rs
.
getString
(
1
);
Assert
.
assertEquals
(
timestampStr
,
actual
);
actual
=
rs
.
getString
(
"ts"
);
Assert
.
assertEquals
(
timestampStr
,
actual
);
}
@Test
public
void
selectUsingTimestampValue
()
throws
SQLException
{
// given
long
timeMillis
=
System
.
currentTimeMillis
();
long
epochSec
=
timeMillis
/
1000
;
long
nanoAdjustment
=
(
timeMillis
%
1000
)
*
1000_000L
+
random
.
nextInt
(
1000_000
);
Timestamp
ts
=
Timestamp
.
from
(
Instant
.
ofEpochSecond
(
epochSec
,
nanoAdjustment
));
// insert one row
String
sql
=
"insert into weather(ts, temperature, humidity) values( ?, ?, ?)"
;
try
(
PreparedStatement
pstmt
=
conn
.
prepareStatement
(
sql
))
{
pstmt
.
setTimestamp
(
1
,
ts
);
pstmt
.
setFloat
(
2
,
12.34f
);
pstmt
.
setInt
(
3
,
55
);
pstmt
.
executeUpdate
();
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
();
}
// when
ResultSet
rs
=
null
;
try
(
Statement
stmt
=
conn
.
createStatement
())
{
rs
=
stmt
.
executeQuery
(
"select * from weather"
);
rs
.
next
();
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
();
}
// then
Timestamp
actual
=
rs
.
getTimestamp
(
1
);
Assert
.
assertEquals
(
ts
,
actual
);
actual
=
rs
.
getTimestamp
(
"ts"
);
Assert
.
assertEquals
(
ts
,
actual
);
Assert
.
assertEquals
(
timeMillis
,
actual
.
getTime
());
Assert
.
assertEquals
(
nanoAdjustment
,
actual
.
getNanos
());
}
@Before
public
void
before
()
{
try
(
Statement
stmt
=
conn
.
createStatement
())
{
stmt
.
execute
(
"drop table if exists weather"
);
stmt
.
execute
(
"create table weather(ts timestamp, temperature float, humidity int)"
);
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
();
}
}
@BeforeClass
public
static
void
beforeClass
()
{
final
String
url
=
"jdbc:TAOS://"
+
host
+
":6030/?user=root&password=taosdata"
;
try
{
conn
=
DriverManager
.
getConnection
(
url
);
Statement
stmt
=
conn
.
createStatement
();
stmt
.
execute
(
"drop database if exists "
+
dbname
);
stmt
.
execute
(
"create database if not exists "
+
dbname
+
" precision 'ns'"
);
stmt
.
execute
(
"use "
+
dbname
);
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
();
}
}
}
src/connector/jdbc/src/test/java/com/taosdata/jdbc/cases/NanoSecondTimestampRestfulTest.java
0 → 100644
浏览文件 @
55757e16
package
com.taosdata.jdbc.cases
;
import
org.junit.Assert
;
import
org.junit.Before
;
import
org.junit.BeforeClass
;
import
org.junit.Test
;
import
java.sql.*
;
import
java.time.Instant
;
import
java.util.Random
;
public
class
NanoSecondTimestampRestfulTest
{
private
static
final
String
host
=
"127.0.0.1"
;
private
static
final
String
dbname
=
"nano_sec_test"
;
private
static
final
Random
random
=
new
Random
(
System
.
currentTimeMillis
());
private
static
Connection
conn
;
@Test
public
void
insertUsingLongValue
()
{
// given
long
ms
=
System
.
currentTimeMillis
();
long
ns
=
ms
*
1000_000
+
random
.
nextInt
(
1000_000
);
// when
int
ret
=
0
;
try
(
Statement
stmt
=
conn
.
createStatement
())
{
ret
=
stmt
.
executeUpdate
(
"insert into weather(ts, temperature, humidity) values("
+
ns
+
", 12.3, 4)"
);
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
();
}
// then
Assert
.
assertEquals
(
1
,
ret
);
}
@Test
public
void
insertUsingStringValue
()
{
// given
// when
int
ret
=
0
;
try
(
Statement
stmt
=
conn
.
createStatement
())
{
ret
=
stmt
.
executeUpdate
(
"insert into weather(ts, temperature, humidity) values('2021-01-01 12:00:00.123456789', 12.3, 4)"
);
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
();
}
// then
Assert
.
assertEquals
(
1
,
ret
);
}
@Test
public
void
insertUsingTimestampValue
()
{
// given
long
epochSec
=
System
.
currentTimeMillis
()
/
1000
;
long
nanoAdjustment
=
random
.
nextInt
(
1000_000_000
);
Timestamp
ts
=
Timestamp
.
from
(
Instant
.
ofEpochSecond
(
epochSec
,
nanoAdjustment
));
// when
int
ret
=
0
;
String
sql
=
"insert into weather(ts, temperature, humidity) values( ?, ?, ?)"
;
try
(
PreparedStatement
pstmt
=
conn
.
prepareStatement
(
sql
))
{
pstmt
.
setTimestamp
(
1
,
ts
);
pstmt
.
setFloat
(
2
,
12.34f
);
pstmt
.
setInt
(
3
,
55
);
ret
=
pstmt
.
executeUpdate
();
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
();
}
// then
Assert
.
assertEquals
(
1
,
ret
);
}
@Test
public
void
selectUsingLongValue
()
throws
SQLException
{
// given
long
ms
=
System
.
currentTimeMillis
();
long
ns
=
ms
*
1000_000L
+
random
.
nextInt
(
1000_000
);
// when
ResultSet
rs
=
null
;
try
(
Statement
stmt
=
conn
.
createStatement
())
{
stmt
.
executeUpdate
(
"insert into weather(ts, temperature, humidity) values("
+
ns
+
", 12.3, 4)"
);
rs
=
stmt
.
executeQuery
(
"select * from weather"
);
rs
.
next
();
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
();
}
// then
long
actual
=
rs
.
getLong
(
1
);
Assert
.
assertEquals
(
ms
,
actual
);
actual
=
rs
.
getLong
(
"ts"
);
Assert
.
assertEquals
(
ms
,
actual
);
}
@Test
public
void
selectUsingStringValue
()
throws
SQLException
{
// given
String
timestampStr
=
"2021-01-01 12:00:00.123456789"
;
// when
ResultSet
rs
=
null
;
try
(
Statement
stmt
=
conn
.
createStatement
())
{
stmt
.
executeUpdate
(
"insert into weather(ts, temperature, humidity) values('"
+
timestampStr
+
"', 12.3, 4)"
);
rs
=
stmt
.
executeQuery
(
"select * from weather"
);
rs
.
next
();
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
();
}
// then
String
actual
=
rs
.
getString
(
1
);
Assert
.
assertEquals
(
timestampStr
,
actual
);
actual
=
rs
.
getString
(
"ts"
);
Assert
.
assertEquals
(
timestampStr
,
actual
);
}
@Test
public
void
selectUsingTimestampValue
()
throws
SQLException
{
// given
long
timeMillis
=
System
.
currentTimeMillis
();
long
epochSec
=
timeMillis
/
1000
;
long
nanoAdjustment
=
(
timeMillis
%
1000
)
*
1000_000L
+
random
.
nextInt
(
1000_000
);
Timestamp
ts
=
Timestamp
.
from
(
Instant
.
ofEpochSecond
(
epochSec
,
nanoAdjustment
));
// insert one row
String
sql
=
"insert into weather(ts, temperature, humidity) values( ?, ?, ?)"
;
try
(
PreparedStatement
pstmt
=
conn
.
prepareStatement
(
sql
))
{
pstmt
.
setTimestamp
(
1
,
ts
);
pstmt
.
setFloat
(
2
,
12.34f
);
pstmt
.
setInt
(
3
,
55
);
pstmt
.
executeUpdate
();
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
();
}
// when
ResultSet
rs
=
null
;
try
(
Statement
stmt
=
conn
.
createStatement
())
{
rs
=
stmt
.
executeQuery
(
"select * from weather"
);
rs
.
next
();
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
();
}
// then
Timestamp
actual
=
rs
.
getTimestamp
(
1
);
Assert
.
assertEquals
(
ts
,
actual
);
actual
=
rs
.
getTimestamp
(
"ts"
);
Assert
.
assertEquals
(
ts
,
actual
);
Assert
.
assertEquals
(
timeMillis
,
actual
.
getTime
());
Assert
.
assertEquals
(
nanoAdjustment
,
actual
.
getNanos
());
}
@Before
public
void
before
()
{
try
(
Statement
stmt
=
conn
.
createStatement
())
{
stmt
.
execute
(
"drop table if exists weather"
);
stmt
.
execute
(
"create table weather(ts timestamp, temperature float, humidity int)"
);
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
();
}
}
@BeforeClass
public
static
void
beforeClass
()
{
final
String
url
=
"jdbc:TAOS-RS://"
+
host
+
":6041/?user=root&password=taosdata"
;
try
{
conn
=
DriverManager
.
getConnection
(
url
);
Statement
stmt
=
conn
.
createStatement
();
stmt
.
execute
(
"drop database if exists "
+
dbname
);
stmt
.
execute
(
"create database if not exists "
+
dbname
+
" precision 'ns'"
);
stmt
.
execute
(
"use "
+
dbname
);
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
();
}
}
}
src/connector/jdbc/src/test/java/com/taosdata/jdbc/cases/NullValueInResultSet
ForJdbcJni
Test.java
→
src/connector/jdbc/src/test/java/com/taosdata/jdbc/cases/NullValueInResultSet
JNI
Test.java
浏览文件 @
55757e16
...
...
@@ -6,7 +6,7 @@ import org.junit.Test;
import
java.sql.*
;
public
class
NullValueInResultSet
ForJdbcJni
Test
{
public
class
NullValueInResultSet
JNI
Test
{
private
static
final
String
host
=
"127.0.0.1"
;
Connection
conn
;
...
...
src/connector/jdbc/src/test/java/com/taosdata/jdbc/cases/NullValueInResultSet
ForJdbc
RestfulTest.java
→
src/connector/jdbc/src/test/java/com/taosdata/jdbc/cases/NullValueInResultSetRestfulTest.java
浏览文件 @
55757e16
...
...
@@ -6,7 +6,7 @@ import org.junit.Test;
import
java.sql.*
;
public
class
NullValueInResultSet
ForJdbc
RestfulTest
{
public
class
NullValueInResultSetRestfulTest
{
private
static
final
String
host
=
"127.0.0.1"
;
Connection
conn
;
...
...
src/connector/jdbc/src/test/java/com/taosdata/jdbc/cases/
TD3841
Test.java
→
src/connector/jdbc/src/test/java/com/taosdata/jdbc/cases/
NullValueInResultSet
Test.java
浏览文件 @
55757e16
...
...
@@ -7,7 +7,7 @@ import org.junit.*;
import
java.sql.*
;
import
java.util.Properties
;
public
class
TD3841
Test
{
public
class
NullValueInResultSet
Test
{
private
static
final
String
host
=
"127.0.0.1"
;
private
static
Properties
properties
;
private
static
Connection
conn_restful
;
...
...
src/connector/jdbc/src/test/java/com/taosdata/jdbc/cases/PreparedStatementBatchInsertJNITest.java
0 → 100644
浏览文件 @
55757e16
package
com.taosdata.jdbc.cases
;
import
org.junit.After
;
import
org.junit.Assert
;
import
org.junit.Before
;
import
org.junit.Test
;
import
java.sql.*
;
import
java.util.List
;
import
java.util.Random
;
import
java.util.stream.Collectors
;
import
java.util.stream.IntStream
;
public
class
PreparedStatementBatchInsertJNITest
{
private
static
final
String
host
=
"127.0.0.1"
;
private
static
final
String
dbname
=
"td4668"
;
private
final
Random
random
=
new
Random
(
System
.
currentTimeMillis
());
private
Connection
conn
;
@Test
public
void
test
()
{
// given
long
ts
=
System
.
currentTimeMillis
();
List
<
Object
[]>
rows
=
IntStream
.
range
(
0
,
10
).
mapToObj
(
i
->
{
Object
[]
row
=
new
Object
[
6
];
final
String
groupId
=
String
.
format
(
"%02d"
,
random
.
nextInt
(
100
));
// table name (d + groupId)组合
row
[
0
]
=
"d"
+
groupId
;
// tag
row
[
1
]
=
groupId
;
// ts
row
[
2
]
=
ts
+
i
;
// current 电流
row
[
3
]
=
random
.
nextFloat
();
// voltage 电压
row
[
4
]
=
Math
.
random
()
>
0.5
?
220
:
380
;
// phase 相位
row
[
5
]
=
random
.
nextInt
(
10
);
return
row
;
}).
collect
(
Collectors
.
toList
());
final
String
sql
=
"INSERT INTO ? (TS,CURRENT,VOLTAGE,PHASE) USING METERS TAGS (?) VALUES (?,?,?,?)"
;
// when
try
(
PreparedStatement
pstmt
=
conn
.
prepareStatement
(
sql
))
{
for
(
Object
[]
row
:
rows
)
{
for
(
int
i
=
0
;
i
<
row
.
length
;
i
++)
{
pstmt
.
setObject
(
i
+
1
,
row
[
i
]);
}
pstmt
.
addBatch
();
}
pstmt
.
executeBatch
();
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
();
Assert
.
fail
();
}
// then
try
(
Statement
stmt
=
conn
.
createStatement
())
{
ResultSet
rs
=
stmt
.
executeQuery
(
"select * from meters"
);
int
count
=
0
;
while
(
rs
.
next
())
{
count
++;
}
Assert
.
assertEquals
(
10
,
count
);
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
();
}
}
@Before
public
void
before
()
{
try
{
conn
=
DriverManager
.
getConnection
(
"jdbc:TAOS://"
+
host
+
":6030/?user=root&password=taosdata"
);
Statement
stmt
=
conn
.
createStatement
();
stmt
.
execute
(
"drop database if exists "
+
dbname
);
stmt
.
execute
(
"create database if not exists "
+
dbname
);
stmt
.
execute
(
"use "
+
dbname
);
stmt
.
execute
(
"create table meters(ts timestamp, current float, voltage int, phase int) tags(groupId int)"
);
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
();
}
}
@After
public
void
after
()
{
try
{
Statement
stmt
=
conn
.
createStatement
();
stmt
.
execute
(
"drop database if exists "
+
dbname
);
stmt
.
close
();
conn
.
close
();
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
();
}
}
}
src/connector/jdbc/src/test/java/com/taosdata/jdbc/cases/PreparedStatementBatchInsertRestfulTest.java
0 → 100644
浏览文件 @
55757e16
package
com.taosdata.jdbc.cases
;
import
org.junit.After
;
import
org.junit.Assert
;
import
org.junit.Before
;
import
org.junit.Test
;
import
java.sql.*
;
import
java.util.List
;
import
java.util.Random
;
import
java.util.stream.Collectors
;
import
java.util.stream.IntStream
;
public
class
PreparedStatementBatchInsertRestfulTest
{
private
static
final
String
host
=
"127.0.0.1"
;
private
static
final
String
dbname
=
"td4668"
;
private
final
Random
random
=
new
Random
(
System
.
currentTimeMillis
());
private
Connection
conn
;
@Test
public
void
test
()
{
// given
long
ts
=
System
.
currentTimeMillis
();
List
<
Object
[]>
rows
=
IntStream
.
range
(
0
,
10
).
mapToObj
(
i
->
{
Object
[]
row
=
new
Object
[
6
];
final
String
groupId
=
String
.
format
(
"%02d"
,
random
.
nextInt
(
100
));
// table name (d + groupId)组合
row
[
0
]
=
"d"
+
groupId
;
// tag
row
[
1
]
=
groupId
;
// ts
row
[
2
]
=
ts
+
i
;
// current 电流
row
[
3
]
=
random
.
nextFloat
();
// voltage 电压
row
[
4
]
=
Math
.
random
()
>
0.5
?
220
:
380
;
// phase 相位
row
[
5
]
=
random
.
nextInt
(
10
);
return
row
;
}).
collect
(
Collectors
.
toList
());
final
String
sql
=
"INSERT INTO ? (TS,CURRENT,VOLTAGE,PHASE) USING METERS TAGS (?) VALUES (?,?,?,?)"
;
// when
try
(
PreparedStatement
pstmt
=
conn
.
prepareStatement
(
sql
))
{
for
(
Object
[]
row
:
rows
)
{
for
(
int
i
=
0
;
i
<
row
.
length
;
i
++)
{
pstmt
.
setObject
(
i
+
1
,
row
[
i
]);
}
pstmt
.
addBatch
();
}
pstmt
.
executeBatch
();
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
();
Assert
.
fail
();
}
// then
try
(
Statement
stmt
=
conn
.
createStatement
())
{
ResultSet
rs
=
stmt
.
executeQuery
(
"select * from meters"
);
int
count
=
0
;
while
(
rs
.
next
())
{
count
++;
}
Assert
.
assertEquals
(
10
,
count
);
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
();
}
}
@Before
public
void
before
()
{
try
{
conn
=
DriverManager
.
getConnection
(
"jdbc:TAOS-RS://"
+
host
+
":6041/?user=root&password=taosdata"
);
Statement
stmt
=
conn
.
createStatement
();
stmt
.
execute
(
"drop database if exists "
+
dbname
);
stmt
.
execute
(
"create database if not exists "
+
dbname
);
stmt
.
execute
(
"use "
+
dbname
);
stmt
.
execute
(
"create table meters(ts timestamp, current float, voltage int, phase int) tags(groupId int)"
);
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
();
}
}
@After
public
void
after
()
{
try
{
Statement
stmt
=
conn
.
createStatement
();
stmt
.
execute
(
"drop database if exists "
+
dbname
);
stmt
.
close
();
conn
.
close
();
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
();
}
}
}
src/connector/jdbc/src/test/java/com/taosdata/jdbc/cases/ResultSetMetaShouldNotBeNullRestfulTest.java
0 → 100644
浏览文件 @
55757e16
package
com.taosdata.jdbc.cases
;
import
org.junit.After
;
import
org.junit.Assert
;
import
org.junit.Before
;
import
org.junit.Test
;
import
java.sql.*
;
public
class
ResultSetMetaShouldNotBeNullRestfulTest
{
private
static
final
String
host
=
"127.0.0.1"
;
private
static
final
String
dbname
=
"td4745"
;
private
Connection
connection
;
@Test
public
void
testExecuteQuery
()
{
// given
ResultSetMetaData
metaData
=
null
;
int
columnCount
=
-
1
;
// when
try
{
Statement
statement
=
connection
.
createStatement
();
metaData
=
statement
.
executeQuery
(
"select * from weather"
).
getMetaData
();
columnCount
=
metaData
.
getColumnCount
();
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
();
}
// then
Assert
.
assertNotNull
(
metaData
);
Assert
.
assertEquals
(
0
,
columnCount
);
}
@Test
public
void
testExecute
()
{
// given
ResultSetMetaData
metaData
=
null
;
int
columnCount
=
-
1
;
boolean
execute
=
false
;
// when
try
{
Statement
statement
=
connection
.
createStatement
();
execute
=
statement
.
execute
(
"select * from weather"
);
metaData
=
statement
.
getResultSet
().
getMetaData
();
columnCount
=
metaData
.
getColumnCount
();
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
();
}
// then
Assert
.
assertEquals
(
true
,
execute
);
Assert
.
assertNotNull
(
metaData
);
Assert
.
assertEquals
(
0
,
columnCount
);
}
@Before
public
void
before
()
{
try
{
connection
=
DriverManager
.
getConnection
(
"jdbc:TAOS-RS://"
+
host
+
":6041/?user=root&password=taosdata"
);
Statement
stmt
=
connection
.
createStatement
();
stmt
.
execute
(
"drop database if exists "
+
dbname
);
stmt
.
execute
(
"create database if not exists "
+
dbname
);
stmt
.
execute
(
"use "
+
dbname
);
stmt
.
execute
(
"create table weather (ts timestamp, temperature float)"
);
stmt
.
close
();
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
();
}
}
@After
public
void
after
()
{
try
{
Statement
stmt
=
connection
.
createStatement
();
stmt
.
execute
(
"drop database if exists "
+
dbname
);
stmt
.
close
();
connection
.
close
();
}
catch
(
SQLException
e
)
{
e
.
printStackTrace
();
}
}
}
src/connector/jdbc/src/test/java/com/taosdata/jdbc/cases/TD4144Test.java
已删除
100644 → 0
浏览文件 @
23117de9
package
com.taosdata.jdbc.cases
;
import
com.taosdata.jdbc.TSDBConnection
;
import
com.taosdata.jdbc.TSDBDriver
;
import
com.taosdata.jdbc.TSDBResultSet
;
import
com.taosdata.jdbc.TSDBSubscribe
;
import
org.junit.AfterClass
;
import
org.junit.BeforeClass
;
import
org.junit.Test
;
import
java.sql.DriverManager
;
import
java.sql.ResultSetMetaData
;
import
java.sql.SQLException
;
import
java.sql.Statement
;
import
java.util.Properties
;
import
java.util.concurrent.TimeUnit
;
public
class
TD4144Test
{
private
static
TSDBConnection
connection
;
private
static
final
String
host
=
"127.0.0.1"
;
private
static
final
String
topic
=
"topic-meter-current-bg-10"
;
private
static
final
String
sql
=
"select * from meters where current > 10"
;
private
static
final
String
sql2
=
"select * from meters where ts >= '2020-08-15 12:20:00.000'"
;
@Test
public
void
test
()
throws
SQLException
{
TSDBSubscribe
subscribe
=
null
;
TSDBResultSet
res
=
null
;
boolean
hasNext
=
false
;
try
{
subscribe
=
connection
.
subscribe
(
topic
,
sql
,
false
);
int
count
=
0
;
while
(
true
)
{
// 等待1秒,避免频繁调用 consume,给服务端造成压力
TimeUnit
.
SECONDS
.
sleep
(
1
);
if
(
res
==
null
)
{
// 消费数据
res
=
subscribe
.
consume
();
hasNext
=
res
.
next
();
}
if
(
res
==
null
)
{
continue
;
}
ResultSetMetaData
metaData
=
res
.
getMetaData
();
int
number
=
0
;
while
(
hasNext
)
{
int
columnCount
=
metaData
.
getColumnCount
();
for
(
int
i
=
1
;
i
<=
columnCount
;
i
++)
{
System
.
out
.
print
(
metaData
.
getColumnLabel
(
i
)
+
": "
+
res
.
getString
(
i
)
+
"\t"
);
}
System
.
out
.
println
();
count
++;
number
++;
hasNext
=
res
.
next
();
if
(!
hasNext
)
{
res
.
close
();
res
=
null
;
System
.
out
.
println
(
"rows: "
+
count
);
}
if
(
hasNext
==
true
&&
number
>=
10
)
{
System
.
out
.
println
(
"batch"
+
number
);
break
;
}
}
}
}
catch
(
SQLException
|
InterruptedException
throwables
)
{
throwables
.
printStackTrace
();
}
finally
{
if
(
subscribe
!=
null
)
subscribe
.
close
(
true
);
}
}
@BeforeClass
public
static
void
beforeClass
()
throws
SQLException
{
Properties
properties
=
new
Properties
();
properties
.
setProperty
(
TSDBDriver
.
PROPERTY_KEY_CHARSET
,
"UTF-8"
);
properties
.
setProperty
(
TSDBDriver
.
PROPERTY_KEY_TIME_ZONE
,
"UTC-8"
);
String
url
=
"jdbc:TAOS://"
+
host
+
":6030/?user=root&password=taosdata"
;
connection
=
(
DriverManager
.
getConnection
(
url
,
properties
)).
unwrap
(
TSDBConnection
.
class
);
try
(
Statement
stmt
=
connection
.
createStatement
())
{
stmt
.
execute
(
"drop database if exists power"
);
stmt
.
execute
(
"create database if not exists power"
);
stmt
.
execute
(
"use power"
);
stmt
.
execute
(
"create table meters(ts timestamp, current float, voltage int, phase int) tags(location binary(64), groupId int)"
);
stmt
.
execute
(
"create table d1001 using meters tags(\"Beijing.Chaoyang\", 2)"
);
stmt
.
execute
(
"create table d1002 using meters tags(\"Beijing.Haidian\", 2)"
);
stmt
.
execute
(
"insert into d1001 values(\"2020-08-15 12:00:00.000\", 12, 220, 1),(\"2020-08-15 12:10:00.000\", 12.3, 220, 2),(\"2020-08-15 12:20:00.000\", 12.2, 220, 1)"
);
stmt
.
execute
(
"insert into d1002 values(\"2020-08-15 12:00:00.000\", 9.9, 220, 1),(\"2020-08-15 12:10:00.000\", 10.3, 220, 1),(\"2020-08-15 12:20:00.000\", 11.2, 220, 1)"
);
}
}
@AfterClass
public
static
void
afterClass
()
throws
SQLException
{
if
(
connection
!=
null
)
connection
.
close
();
}
}
src/connector/jdbc/src/test/java/com/taosdata/jdbc/utils/UtilsTest.java
浏览文件 @
55757e16
...
...
@@ -3,22 +3,98 @@ package com.taosdata.jdbc.utils;
import
org.junit.Assert
;
import
org.junit.Test
;
import
static
org
.
junit
.
Assert
.*
;
import
java.util.stream.Stream
;
public
class
UtilsTest
{
@Test
public
void
escapeSingleQuota
()
{
// given
String
s
=
"'''''a\\'"
;
// when
String
news
=
Utils
.
escapeSingleQuota
(
s
);
// then
Assert
.
assertEquals
(
"\\'\\'\\'\\'\\'a\\'"
,
news
);
// given
s
=
"\'''''a\\'"
;
// when
news
=
Utils
.
escapeSingleQuota
(
s
);
// then
Assert
.
assertEquals
(
"\\'\\'\\'\\'\\'a\\'"
,
news
);
// given
s
=
"\'\'\'\''a\\'"
;
// when
news
=
Utils
.
escapeSingleQuota
(
s
);
// then
Assert
.
assertEquals
(
"\\'\\'\\'\\'\\'a\\'"
,
news
);
}
@Test
public
void
getNativeSqlReplaceQuestionMarks
()
{
// given
String
nativeSql
=
"insert into ?.? (ts, temperature, humidity) using ?.? tags(?,?) values(now, ?, ?)"
;
Object
[]
parameters
=
Stream
.
of
(
"test"
,
"t1"
,
"test"
,
"weather"
,
"beijing"
,
1
,
12.2
,
4
).
toArray
();
// when
String
actual
=
Utils
.
getNativeSql
(
nativeSql
,
parameters
);
// then
String
expected
=
"insert into test.t1 (ts, temperature, humidity) using test.weather tags('beijing',1) values(now, 12.2, 4)"
;
Assert
.
assertEquals
(
expected
,
actual
);
}
@Test
public
void
getNativeSqlReplaceQuestionMarks2
()
{
// given
String
nativeSql
=
"INSERT INTO ? (TS,CURRENT,VOLTAGE,PHASE) USING METERS TAGS (?) VALUES (?,?,?,?)"
;
Object
[]
parameters
=
Stream
.
of
(
"d1"
,
1
,
123
,
3.14
,
220
,
4
).
toArray
();
// when
String
actual
=
Utils
.
getNativeSql
(
nativeSql
,
parameters
);
// then
String
expected
=
"INSERT INTO d1 (TS,CURRENT,VOLTAGE,PHASE) USING METERS TAGS (1) VALUES (123,3.14,220,4)"
;
Assert
.
assertEquals
(
expected
,
actual
);
}
@Test
public
void
getNativeSqlReplaceNothing
()
{
// given
String
nativeSql
=
"insert into test.t1 (ts, temperature, humidity) using test.weather tags('beijing',1) values(now, 12.2, 4)"
;
// when
String
actual
=
Utils
.
getNativeSql
(
nativeSql
,
null
);
// then
Assert
.
assertEquals
(
nativeSql
,
actual
);
}
@Test
public
void
getNativeSqlReplaceNothing2
()
{
// given
String
nativeSql
=
"insert into test.t1 (ts, temperature, humidity) using test.weather tags('beijing',1) values(now, 12.2, 4)"
;
Object
[]
parameters
=
Stream
.
of
(
"test"
,
"t1"
,
"test"
,
"weather"
,
"beijing"
,
1
,
12.2
,
4
).
toArray
();
// when
String
actual
=
Utils
.
getNativeSql
(
nativeSql
,
parameters
);
// then
Assert
.
assertEquals
(
nativeSql
,
actual
);
}
@Test
public
void
getNativeSqlReplaceNothing3
()
{
// given
String
nativeSql
=
"insert into ?.? (ts, temperature, humidity) using ?.? tags(?,?) values(now, ?, ?)"
;
// when
String
actual
=
Utils
.
getNativeSql
(
nativeSql
,
null
);
// then
Assert
.
assertEquals
(
nativeSql
,
actual
);
}
}
\ No newline at end of file
src/connector/python/setup.py
浏览文件 @
55757e16
...
...
@@ -5,7 +5,7 @@ with open("README.md", "r") as fh:
setuptools
.
setup
(
name
=
"taos"
,
version
=
"2.0.1
0
"
,
version
=
"2.0.1
1
"
,
author
=
"Taosdata Inc."
,
author_email
=
"support@taosdata.com"
,
description
=
"TDengine python client package"
,
...
...
src/connector/python/taos/cinterface.py
浏览文件 @
55757e16
...
...
@@ -14,12 +14,22 @@ def _convert_microsecond_to_datetime(micro): #checkpoint
return
datetime
.
datetime
.
fromtimestamp
(
micro
/
1000000.0
)
def
_crow_timestamp_to_python
(
data
,
num_of_rows
,
nbytes
=
None
,
micro
=
False
):
#checkpoint
def
_convert_nanosecond_to_datetime
(
nanosec
):
return
nanosec
def
_crow_timestamp_to_python
(
data
,
num_of_rows
,
nbytes
=
None
,
precision
=
FieldType
.
C_TIMESTAMP_UNKNOWN
):
"""Function to convert C bool row to python row
"""
_timestamp_converter
=
_convert_millisecond_to_datetime
if
micro
:
if
precision
==
FieldType
.
C_TIMESTAMP_MILLI
:
_timestamp_converter
=
_convert_millisecond_to_datetime
elif
precision
==
FieldType
.
C_TIMESTAMP_MICRO
:
_timestamp_converter
=
_convert_microsecond_to_datetime
elif
precision
==
FieldType
.
C_TIMESTAMP_NANO
:
_timestamp_converter
=
_convert_nanosecond_to_datetime
else
:
raise
DatabaseError
(
"Unknown precision returned from database"
)
return
[
None
if
ele
==
FieldType
.
C_BIGINT_NULL
else
_timestamp_converter
(
ele
)
for
ele
in
ctypes
.
cast
(
...
...
@@ -28,7 +38,7 @@ def _crow_timestamp_to_python(data, num_of_rows, nbytes=None, micro=False):#chec
:
abs
(
num_of_rows
)]]
def
_crow_bool_to_python
(
data
,
num_of_rows
,
nbytes
=
None
,
micro
=
False
):
def
_crow_bool_to_python
(
data
,
num_of_rows
,
nbytes
=
None
,
precision
=
FieldType
.
C_TIMESTAMP_UNKNOWN
):
"""Function to convert C bool row to python row
"""
return
[
...
...
@@ -38,7 +48,7 @@ def _crow_bool_to_python(data, num_of_rows, nbytes=None, micro=False):
:
abs
(
num_of_rows
)]]
def
_crow_tinyint_to_python
(
data
,
num_of_rows
,
nbytes
=
None
,
micro
=
False
):
def
_crow_tinyint_to_python
(
data
,
num_of_rows
,
nbytes
=
None
,
precision
=
FieldType
.
C_TIMESTAMP_UNKNOWN
):
"""Function to convert C tinyint row to python row
"""
return
[
None
if
ele
==
FieldType
.
C_TINYINT_NULL
else
ele
for
ele
in
ctypes
.
cast
(
...
...
@@ -49,7 +59,7 @@ def _crow_tinyint_unsigned_to_python(
data
,
num_of_rows
,
nbytes
=
None
,
micro
=
False
):
precision
=
FieldType
.
C_TIMESTAMP_UNKNOWN
):
"""Function to convert C tinyint row to python row
"""
return
[
...
...
@@ -59,7 +69,7 @@ def _crow_tinyint_unsigned_to_python(
:
abs
(
num_of_rows
)]]
def
_crow_smallint_to_python
(
data
,
num_of_rows
,
nbytes
=
None
,
micro
=
False
):
def
_crow_smallint_to_python
(
data
,
num_of_rows
,
nbytes
=
None
,
precision
=
FieldType
.
C_TIMESTAMP_UNKNOWN
):
"""Function to convert C smallint row to python row
"""
return
[
...
...
@@ -70,7 +80,7 @@ def _crow_smallint_to_python(data, num_of_rows, nbytes=None, micro=False):
def
_crow_smallint_unsigned_to_python
(
data
,
num_of_rows
,
nbytes
=
None
,
micro
=
False
):
data
,
num_of_rows
,
nbytes
=
None
,
precision
=
FieldType
.
C_TIMESTAMP_UNKNOWN
):
"""Function to convert C smallint row to python row
"""
return
[
...
...
@@ -80,14 +90,14 @@ def _crow_smallint_unsigned_to_python(
:
abs
(
num_of_rows
)]]
def
_crow_int_to_python
(
data
,
num_of_rows
,
nbytes
=
None
,
micro
=
False
):
def
_crow_int_to_python
(
data
,
num_of_rows
,
nbytes
=
None
,
precision
=
FieldType
.
C_TIMESTAMP_UNKNOWN
):
"""Function to convert C int row to python row
"""
return
[
None
if
ele
==
FieldType
.
C_INT_NULL
else
ele
for
ele
in
ctypes
.
cast
(
data
,
ctypes
.
POINTER
(
ctypes
.
c_int
))[:
abs
(
num_of_rows
)]]
def
_crow_int_unsigned_to_python
(
data
,
num_of_rows
,
nbytes
=
None
,
micro
=
False
):
def
_crow_int_unsigned_to_python
(
data
,
num_of_rows
,
nbytes
=
None
,
precision
=
FieldType
.
C_TIMESTAMP_UNKNOWN
):
"""Function to convert C int row to python row
"""
return
[
...
...
@@ -97,7 +107,7 @@ def _crow_int_unsigned_to_python(data, num_of_rows, nbytes=None, micro=False):
:
abs
(
num_of_rows
)]]
def
_crow_bigint_to_python
(
data
,
num_of_rows
,
nbytes
=
None
,
micro
=
False
):
def
_crow_bigint_to_python
(
data
,
num_of_rows
,
nbytes
=
None
,
precision
=
FieldType
.
C_TIMESTAMP_UNKNOWN
):
"""Function to convert C bigint row to python row
"""
return
[
None
if
ele
==
FieldType
.
C_BIGINT_NULL
else
ele
for
ele
in
ctypes
.
cast
(
...
...
@@ -108,7 +118,7 @@ def _crow_bigint_unsigned_to_python(
data
,
num_of_rows
,
nbytes
=
None
,
micro
=
False
):
precision
=
FieldType
.
C_TIMESTAMP_UNKNOWN
):
"""Function to convert C bigint row to python row
"""
return
[
...
...
@@ -118,21 +128,21 @@ def _crow_bigint_unsigned_to_python(
:
abs
(
num_of_rows
)]]
def
_crow_float_to_python
(
data
,
num_of_rows
,
nbytes
=
None
,
micro
=
False
):
def
_crow_float_to_python
(
data
,
num_of_rows
,
nbytes
=
None
,
precision
=
FieldType
.
C_TIMESTAMP_UNKNOWN
):
"""Function to convert C float row to python row
"""
return
[
None
if
math
.
isnan
(
ele
)
else
ele
for
ele
in
ctypes
.
cast
(
data
,
ctypes
.
POINTER
(
ctypes
.
c_float
))[:
abs
(
num_of_rows
)]]
def
_crow_double_to_python
(
data
,
num_of_rows
,
nbytes
=
None
,
micro
=
False
):
def
_crow_double_to_python
(
data
,
num_of_rows
,
nbytes
=
None
,
precision
=
FieldType
.
C_TIMESTAMP_UNKNOWN
):
"""Function to convert C double row to python row
"""
return
[
None
if
math
.
isnan
(
ele
)
else
ele
for
ele
in
ctypes
.
cast
(
data
,
ctypes
.
POINTER
(
ctypes
.
c_double
))[:
abs
(
num_of_rows
)]]
def
_crow_binary_to_python
(
data
,
num_of_rows
,
nbytes
=
None
,
micro
=
False
):
def
_crow_binary_to_python
(
data
,
num_of_rows
,
nbytes
=
None
,
precision
=
FieldType
.
C_TIMESTAMP_UNKNOWN
):
"""Function to convert C binary row to python row
"""
assert
(
nbytes
is
not
None
)
...
...
@@ -140,7 +150,7 @@ def _crow_binary_to_python(data, num_of_rows, nbytes=None, micro=False):
'utf-8'
)
for
ele
in
(
ctypes
.
cast
(
data
,
ctypes
.
POINTER
(
ctypes
.
c_char
*
nbytes
)))[:
abs
(
num_of_rows
)]]
def
_crow_nchar_to_python
(
data
,
num_of_rows
,
nbytes
=
None
,
micro
=
False
):
def
_crow_nchar_to_python
(
data
,
num_of_rows
,
nbytes
=
None
,
precision
=
FieldType
.
C_TIMESTAMP_UNKNOWN
):
"""Function to convert C nchar row to python row
"""
assert
(
nbytes
is
not
None
)
...
...
@@ -159,7 +169,7 @@ def _crow_nchar_to_python(data, num_of_rows, nbytes=None, micro=False):
return
res
def
_crow_binary_to_python_block
(
data
,
num_of_rows
,
nbytes
=
None
,
micro
=
False
):
def
_crow_binary_to_python_block
(
data
,
num_of_rows
,
nbytes
=
None
,
precision
=
FieldType
.
C_TIMESTAMP_UNKNOWN
):
"""Function to convert C binary row to python row
"""
assert
(
nbytes
is
not
None
)
...
...
@@ -178,7 +188,7 @@ def _crow_binary_to_python_block(data, num_of_rows, nbytes=None, micro=False):
return
res
def
_crow_nchar_to_python_block
(
data
,
num_of_rows
,
nbytes
=
None
,
micro
=
False
):
def
_crow_nchar_to_python_block
(
data
,
num_of_rows
,
nbytes
=
None
,
precision
=
FieldType
.
C_TIMESTAMP_UNKNOWN
):
"""Function to convert C nchar row to python row
"""
assert
(
nbytes
is
not
None
)
...
...
@@ -448,8 +458,7 @@ class CTaosInterface(object):
result
,
ctypes
.
byref
(
pblock
))
if
num_of_rows
==
0
:
return
None
,
0
isMicro
=
(
CTaosInterface
.
libtaos
.
taos_result_precision
(
result
)
==
FieldType
.
C_TIMESTAMP_MICRO
)
precision
=
CTaosInterface
.
libtaos
.
taos_result_precision
(
result
)
blocks
=
[
None
]
*
len
(
fields
)
fieldL
=
CTaosInterface
.
libtaos
.
taos_fetch_lengths
(
result
)
fieldLen
=
[
...
...
@@ -462,7 +471,7 @@ class CTaosInterface(object):
if
fields
[
i
][
'type'
]
not
in
_CONVERT_FUNC_BLOCK
:
raise
DatabaseError
(
"Invalid data type returned from database"
)
blocks
[
i
]
=
_CONVERT_FUNC_BLOCK
[
fields
[
i
][
'type'
]](
data
,
num_of_rows
,
fieldLen
[
i
],
isMicro
)
data
,
num_of_rows
,
fieldLen
[
i
],
precision
)
return
blocks
,
abs
(
num_of_rows
)
...
...
@@ -472,8 +481,7 @@ class CTaosInterface(object):
pblock
=
CTaosInterface
.
libtaos
.
taos_fetch_row
(
result
)
if
pblock
:
num_of_rows
=
1
isMicro
=
(
CTaosInterface
.
libtaos
.
taos_result_precision
(
result
)
==
FieldType
.
C_TIMESTAMP_MICRO
)
precision
=
CTaosInterface
.
libtaos
.
taos_result_precision
(
result
)
blocks
=
[
None
]
*
len
(
fields
)
fieldL
=
CTaosInterface
.
libtaos
.
taos_fetch_lengths
(
result
)
fieldLen
=
[
...
...
@@ -490,7 +498,7 @@ class CTaosInterface(object):
blocks
[
i
]
=
[
None
]
else
:
blocks
[
i
]
=
_CONVERT_FUNC
[
fields
[
i
][
'type'
]](
data
,
num_of_rows
,
fieldLen
[
i
],
isMicro
)
data
,
num_of_rows
,
fieldLen
[
i
],
precision
)
else
:
return
None
,
0
return
blocks
,
abs
(
num_of_rows
)
...
...
src/connector/python/taos/constants.py
浏览文件 @
55757e16
...
...
@@ -40,3 +40,5 @@ class FieldType(object):
# Timestamp precision definition
C_TIMESTAMP_MILLI
=
0
C_TIMESTAMP_MICRO
=
1
C_TIMESTAMP_NANO
=
2
C_TIMESTAMP_UNKNOWN
=
3
src/dnode/inc/dnodeCfg.h
浏览文件 @
55757e16
...
...
@@ -27,6 +27,7 @@ void dnodeUpdateCfg(SDnodeCfg *cfg);
int32_t
dnodeGetDnodeId
();
void
dnodeGetClusterId
(
char
*
clusterId
);
void
dnodeGetCfg
(
int32_t
*
dnodeId
,
char
*
clusterId
);
void
dnodeSetDropped
();
#ifdef __cplusplus
}
...
...
src/dnode/src/dnodeCfg.c
浏览文件 @
55757e16
...
...
@@ -21,6 +21,7 @@
static
SDnodeCfg
tsCfg
=
{
0
};
static
pthread_mutex_t
tsCfgMutex
;
static
int32_t
tsDnodeDropped
;
static
int32_t
dnodeReadCfg
();
static
int32_t
dnodeWriteCfg
();
...
...
@@ -34,6 +35,10 @@ int32_t dnodeInitCfg() {
if
(
ret
==
0
)
{
dInfo
(
"dnode cfg is initialized"
);
}
if
(
tsDnodeDropped
)
{
dInfo
(
"dnode is dropped, exiting"
);
return
-
1
;
}
return
ret
;
}
...
...
@@ -44,6 +49,14 @@ void dnodeUpdateCfg(SDnodeCfg *cfg) {
dnodeResetCfg
(
cfg
);
}
void
dnodeSetDropped
()
{
pthread_mutex_lock
(
&
tsCfgMutex
);
tsDnodeDropped
=
1
;
dnodeWriteCfg
();
pthread_mutex_unlock
(
&
tsCfgMutex
);
}
int32_t
dnodeGetDnodeId
()
{
int32_t
dnodeId
=
0
;
pthread_mutex_lock
(
&
tsCfgMutex
);
...
...
@@ -119,6 +132,14 @@ static int32_t dnodeReadCfg() {
}
cfg
.
dnodeId
=
(
int32_t
)
dnodeId
->
valueint
;
cJSON
*
dnodeDropped
=
cJSON_GetObjectItem
(
root
,
"dnodeDropped"
);
if
(
!
dnodeDropped
||
dnodeDropped
->
type
!=
cJSON_Number
)
{
dError
(
"failed to read %s, dnodeDropped not found"
,
file
);
//goto PARSE_CFG_OVER;
}
else
{
tsDnodeDropped
=
(
int32_t
)
dnodeDropped
->
valueint
;
}
cJSON
*
clusterId
=
cJSON_GetObjectItem
(
root
,
"clusterId"
);
if
(
!
clusterId
||
clusterId
->
type
!=
cJSON_String
)
{
dError
(
"failed to read %s, clusterId not found"
,
file
);
...
...
@@ -154,6 +175,7 @@ static int32_t dnodeWriteCfg() {
len
+=
snprintf
(
content
+
len
,
maxLen
-
len
,
"{
\n
"
);
len
+=
snprintf
(
content
+
len
,
maxLen
-
len
,
"
\"
dnodeId
\"
: %d,
\n
"
,
tsCfg
.
dnodeId
);
len
+=
snprintf
(
content
+
len
,
maxLen
-
len
,
"
\"
dnodeDropped
\"
: %d,
\n
"
,
tsDnodeDropped
);
len
+=
snprintf
(
content
+
len
,
maxLen
-
len
,
"
\"
clusterId
\"
:
\"
%s
\"\n
"
,
tsCfg
.
clusterId
);
len
+=
snprintf
(
content
+
len
,
maxLen
-
len
,
"}
\n
"
);
...
...
src/dnode/src/dnodeVnodes.c
浏览文件 @
55757e16
...
...
@@ -202,6 +202,7 @@ static void dnodeProcessStatusRsp(SRpcMsg *pMsg) {
char
clusterId
[
TSDB_CLUSTER_ID_LEN
];
dnodeGetClusterId
(
clusterId
);
if
(
clusterId
[
0
]
!=
'\0'
)
{
dnodeSetDropped
();
dError
(
"exit zombie dropped dnode"
);
exit
(
EXIT_FAILURE
);
}
...
...
src/query/inc/qTableMeta.h
浏览文件 @
55757e16
...
...
@@ -138,7 +138,6 @@ typedef struct SQueryInfo {
bool
hasFilter
;
bool
onlyTagQuery
;
bool
orderProjectQuery
;
// bool diffQuery;
bool
stateWindow
;
}
SQueryInfo
;
...
...
src/query/inc/sql.y
浏览文件 @
55757e16
...
...
@@ -176,7 +176,7 @@ cmd ::= ALTER ACCOUNT ids(X) PASS ids(Y) acct_optr(Z). { setCreateAcctSql(p
////////////////////////////// COMPACT STATEMENT //////////////////////////////////////////////
cmd ::= COMPACT VNODES IN LP exprlist(Y) RP. { setCompactVnodeSql(pInfo, TSDB_SQL_COMPACT_VNODE, Y);}
cmd ::= COMPACT VNODES IN LP exprlist(Y) RP. { setCompactVnodeSql(pInfo, TSDB_SQL_COMPACT_VNODE, Y);}
// An IDENTIFIER can be a generic identifier, or one of several keywords.
// Any non-standard keyword can also be an identifier.
...
...
src/query/src/qAggMain.c
浏览文件 @
55757e16
...
...
@@ -3613,16 +3613,7 @@ static void deriv_function(SQLFunctionCtx *pCtx) {
qError
(
"error input type"
);
}
// initial value is not set yet, all data block are null
if
(
!
pDerivInfo
->
valueSet
||
notNullElems
<=
0
)
{
/*
* 1. current block and blocks before are full of null
* 2. current block may be null value
*/
assert
(
pCtx
->
hasNull
);
}
else
{
GET_RES_INFO
(
pCtx
)
->
numOfRes
+=
notNullElems
;
}
GET_RES_INFO
(
pCtx
)
->
numOfRes
+=
notNullElems
;
}
#define DIFF_IMPL(ctx, d, type) \
...
...
src/query/src/qExecutor.c
浏览文件 @
55757e16
...
...
@@ -1312,6 +1312,8 @@ static void doHashGroupbyAgg(SOperatorInfo* pOperator, SGroupbyOperatorInfo *pIn
}
}
// todo opt perf
for
(
int32_t
k
=
0
;
k
<
pOperator
->
numOfOutput
;
++
k
)
{
pInfo
->
binfo
.
pCtx
[
k
].
size
=
1
;
int32_t
functionId
=
pInfo
->
binfo
.
pCtx
[
k
].
functionId
;
...
...
src/tsdb/src/tsdbMain.c
浏览文件 @
55757e16
...
...
@@ -812,6 +812,7 @@ int tsdbRestoreInfo(STsdbRepo *pRepo) {
STable
*
pTable
=
pMeta
->
tables
[
i
];
if
(
pTable
==
NULL
)
continue
;
pTable
->
restoreColumnNum
=
0
;
pTable
->
hasRestoreLastColumn
=
false
;
}
}
...
...
@@ -895,6 +896,7 @@ int tsdbCacheLastData(STsdbRepo *pRepo, STsdbCfg* oldCfg) {
maxTableIdx
=
i
;
if
(
cacheLastCol
)
{
pTable
->
restoreColumnNum
=
0
;
pTable
->
hasRestoreLastColumn
=
false
;
}
}
...
...
@@ -913,6 +915,7 @@ int tsdbCacheLastData(STsdbRepo *pRepo, STsdbCfg* oldCfg) {
}
if
(
need_free_last_col
)
{
tsdbFreeLastColumns
(
pTable
);
pTable
->
hasRestoreLastColumn
=
false
;
}
}
}
...
...
src/tsdb/src/tsdbMeta.c
浏览文件 @
55757e16
...
...
@@ -609,6 +609,7 @@ void tsdbFreeLastColumns(STable* pTable) {
pTable
->
maxColNum
=
0
;
pTable
->
lastColSVersion
=
-
1
;
pTable
->
restoreColumnNum
=
0
;
pTable
->
hasRestoreLastColumn
=
false
;
}
int16_t
tsdbGetLastColumnsIndexByColId
(
STable
*
pTable
,
int16_t
colId
)
{
...
...
@@ -645,6 +646,7 @@ int tsdbInitColIdCacheWithSchema(STable* pTable, STSchema* pSchema) {
pTable
->
lastColSVersion
=
schemaVersion
(
pSchema
);
pTable
->
maxColNum
=
numOfColumn
;
pTable
->
restoreColumnNum
=
0
;
pTable
->
hasRestoreLastColumn
=
false
;
return
0
;
}
...
...
@@ -657,7 +659,7 @@ int tsdbUpdateLastColSchema(STable *pTable, STSchema *pNewSchema) {
return
0
;
}
tsdb
Info
(
"tsdbUpdateLastColSchema:%s,%d->%d"
,
pTable
->
name
->
data
,
pTable
->
lastColSVersion
,
schemaVersion
(
pNewSchema
));
tsdb
Debug
(
"tsdbUpdateLastColSchema:%s,%d->%d"
,
pTable
->
name
->
data
,
pTable
->
lastColSVersion
,
schemaVersion
(
pNewSchema
));
int16_t
numOfCols
=
pNewSchema
->
numOfCols
;
SDataCol
*
lastCols
=
(
SDataCol
*
)
malloc
(
numOfCols
*
sizeof
(
SDataCol
));
...
...
@@ -802,6 +804,7 @@ static STable *tsdbNewTable() {
pTable
->
lastCols
=
NULL
;
pTable
->
restoreColumnNum
=
0
;
pTable
->
maxColNum
=
0
;
pTable
->
hasRestoreLastColumn
=
false
;
pTable
->
lastColSVersion
=
-
1
;
return
pTable
;
}
...
...
src/tsdb/src/tsdbRead.c
浏览文件 @
55757e16
...
...
@@ -2520,7 +2520,7 @@ static bool loadCachedLast(STsdbQueryHandle* pQueryHandle) {
int32_t
numOfCols
=
pTable
->
maxColNum
;
if
(
pTable
->
lastCols
==
NULL
||
pTable
->
maxColNum
<=
0
)
{
tsdbWarn
(
"no last cached for table
, uid:%"
PRIu64
",tid:%d"
,
pTable
->
tableId
.
uid
,
pTable
->
tableId
.
tid
);
tsdbWarn
(
"no last cached for table
%s, uid:%"
PRIu64
",tid:%d"
,
pTable
->
name
->
data
,
pTable
->
tableId
.
uid
,
pTable
->
tableId
.
tid
);
continue
;
}
...
...
tests/pytest/dbmgmt/nanoSecondCheck.py
浏览文件 @
55757e16
...
...
@@ -29,13 +29,14 @@ class TDTestCase:
def
run
(
self
):
tdSql
.
prepare
()
tdSql
.
execute
(
'reset query cache'
)
tdSql
.
execute
(
'drop database if exists db'
)
tdSql
.
execute
(
'create database db precision "ns";'
)
tdSql
.
query
(
'show databases;'
)
tdSql
.
checkData
(
0
,
16
,
'ns'
)
tdSql
.
execute
(
'use db'
)
tdLog
.
debug
(
'testing nanosecond support in 1st timestamp'
)
tdSql
.
execute
(
'create table tb (ts timestamp, speed int)'
)
tdSql
.
execute
(
'insert into tb values(
\'
2021-06-10 0:00:00.100000001
\'
, 1);'
)
tdSql
.
execute
(
'insert into tb values(1623254400150000000, 2);'
)
...
...
@@ -47,8 +48,6 @@ class TDTestCase:
tdSql
.
execute
(
'insert into tb values(1623254400999999999, 7);'
)
#TODO: after the connector is updated, run the following commented code
#TODO: due to the precision limit of double, spread currently cannot be tested since ns timestampe cannot be accurately represented
tdSql
.
query
(
'select * from tb;'
)
tdSql
.
checkData
(
0
,
0
,
'2021-06-10 0:00:00.100000001'
)
tdSql
.
checkData
(
1
,
0
,
'2021-06-10 0:00:00.150000000'
)
...
...
@@ -75,7 +74,7 @@ class TDTestCase:
# os.system('sudo timedatectl set-ntp off')
# os.system('sudo timedatectl set-time 2021-06-10')
tdSql
.
query
(
'select count(*) from tb where ts > now + 400000000b;'
)
tdSql
.
check
Data
(
0
,
0
,
0
)
tdSql
.
check
Rows
(
0
)
tdSql
.
query
(
'select count(*) from tb where ts >=
\'
2021-06-10 0:00:00.100000001
\'
;'
)
tdSql
.
checkData
(
0
,
0
,
6
)
...
...
@@ -84,7 +83,7 @@ class TDTestCase:
tdSql
.
checkData
(
0
,
0
,
4
)
tdSql
.
query
(
'select count(*) from tb where ts =
\'
2021-06-10 0:00:00.000000000
\'
;'
)
tdSql
.
check
Data
(
0
,
0
,
0
)
tdSql
.
check
Rows
(
0
)
tdSql
.
query
(
'select count(*) from tb where ts = 1623254400150000000;'
)
tdSql
.
checkData
(
0
,
0
,
1
)
...
...
@@ -119,6 +118,7 @@ class TDTestCase:
tdSql
.
query
(
'select * from tb;'
)
tdSql
.
checkRows
(
7
)
tdLog
.
debug
(
'testing nanosecond support in other timestamps'
)
tdSql
.
execute
(
'create table tb2 (ts timestamp, speed int, ts2 timestamp);'
)
tdSql
.
execute
(
'insert into tb2 values(
\'
2021-06-10 0:00:00.100000001
\'
, 1,
\'
2021-06-11 0:00:00.100000001
\'
);'
)
tdSql
.
execute
(
'insert into tb2 values(1623254400150000000, 2, 1623340800150000000);'
)
...
...
@@ -150,7 +150,7 @@ class TDTestCase:
# os.system('sudo timedatectl set-ntp off')
# os.system('sudo timedatectl set-time 2021-06-11')
tdSql
.
query
(
'select count(*) from tb2 where ts2 > now + 400000000b;'
)
tdSql
.
check
Data
(
0
,
0
,
0
)
tdSql
.
check
Rows
(
0
)
tdSql
.
query
(
'select count(*) from tb2 where ts2 >=
\'
2021-06-11 0:00:00.100000001
\'
;'
)
...
...
@@ -160,7 +160,7 @@ class TDTestCase:
tdSql
.
checkData
(
0
,
0
,
5
)
tdSql
.
query
(
'select count(*) from tb2 where ts2 =
\'
2021-06-11 0:00:00.000000000
\'
;'
)
tdSql
.
check
Data
(
0
,
0
,
0
)
tdSql
.
check
Rows
(
0
)
tdSql
.
query
(
'select count(*) from tb2 where ts2 =
\'
2021-06-11 0:00:00.300000001
\'
;'
)
tdSql
.
checkData
(
0
,
0
,
1
)
...
...
@@ -190,6 +190,7 @@ class TDTestCase:
tdSql
.
query
(
'select * from tb2;'
)
tdSql
.
checkRows
(
7
)
tdLog
.
debug
(
'testing ill nanosecond format handling'
)
tdSql
.
execute
(
'create table tb3 (ts timestamp, speed int);'
)
tdSql
.
error
(
'insert into tb3 values(16232544001500000, 2);'
)
...
...
tests/pytest/fulltest.sh
浏览文件 @
55757e16
...
...
@@ -25,6 +25,8 @@ python3 ./test.py -f insert/special_character_show.py
python3 bug2265.py
python3 ./test.py
-f
insert/bug3654.py
python3 ./test.py
-f
insert/insertDynamicColBeforeVal.py
python3 ./test.py
-f
insert/in_function.py
python3 ./test.py
-f
insert/modify_column.py
#table
python3 ./test.py
-f
table/alter_wal0.py
...
...
@@ -73,6 +75,7 @@ python3 ./test.py -f tag_lite/smallint.py
python3 ./test.py
-f
tag_lite/tinyint.py
#python3 ./test.py -f dbmgmt/database-name-boundary.py
python3 test.py
-f
dbmgmt/nanoSecondCheck.py
python3 ./test.py
-f
import_merge/importBlock1HO.py
python3 ./test.py
-f
import_merge/importBlock1HPO.py
...
...
tests/pytest/functions/function_derivative.py
浏览文件 @
55757e16
...
...
@@ -128,7 +128,14 @@ class TDTestCase:
def
run
(
self
):
tdSql
.
prepare
()
self
.
insertAndCheckData
()
self
.
insertAndCheckData
()
tdSql
.
execute
(
"create table st(ts timestamp, c1 int, c2 int) tags(id int)"
)
tdSql
.
execute
(
"insert into dev1(ts, c1) using st tags(1) values(now, 1)"
)
tdSql
.
error
(
"select derivative(c1, 10s, 0) from (select c1 from st)"
)
tdSql
.
query
(
"select diff(c1) from (select derivative(c1, 1s, 0) c1 from dev1)"
)
tdSql
.
checkRows
(
0
)
def
stop
(
self
):
tdSql
.
close
()
...
...
tests/pytest/insert/in_function.py
0 → 100644
浏览文件 @
55757e16
此差异已折叠。
点击以展开。
tests/pytest/insert/modify_column.py
0 → 100644
浏览文件 @
55757e16
###################################################################
# Copyright (c) 2016 by TAOS Technologies, Inc.
# All rights reserved.
#
# This file is proprietary and confidential to TAOS Technologies.
# No part of this file may be reproduced, stored, transmitted,
# disclosed or used in any form or by any means other than as
# expressly provided by the written permission from Jianhui Tao
#
###################################################################
# -*- coding: utf-8 -*-
import
sys
import
datetime
from
util.log
import
*
from
util.cases
import
*
from
util.sql
import
*
class
TDTestCase
:
def
init
(
self
,
conn
,
logSql
):
tdLog
.
debug
(
"start to execute %s"
%
__file__
)
tdSql
.
init
(
conn
.
cursor
(),
logSql
)
def
run
(
self
):
tdSql
.
prepare
()
# test case for https://jira.taosdata.com:18080/browse/TD-4541
tdLog
.
info
(
"=============== step1,check normal table"
)
tdLog
.
info
(
"=============== step1.1,drop table && create table"
)
cmd1
=
'drop table if exists length11 ;'
cmd2
=
'create table length11 (ts timestamp,lengthbia binary(10),lengthnchar nchar(20));'
tdLog
.
info
(
cmd1
)
tdSql
.
execute
(
cmd1
)
tdLog
.
info
(
cmd2
)
tdSql
.
execute
(
cmd2
)
tdLog
.
info
(
"=============== step1.2,insert table right data"
)
cmd1
=
'insert into length11 values(now,
\'
aaaaaaaaaa
\'
,
\'
bbbbbbbbbbbbbbbbbbbb
\'
) ;'
tdLog
.
info
(
cmd1
)
tdSql
.
execute
(
cmd1
)
tdSql
.
query
(
'select * from length11 order by ts desc'
)
tdSql
.
checkData
(
0
,
1
,
'aaaaaaaaaa'
)
tdSql
.
checkData
(
0
,
2
,
'bbbbbbbbbbbbbbbbbbbb'
)
tdLog
.
info
(
"=============== step1.3,insert table wrong data"
)
cmd1
=
'insert into length11 values(now,
\'
aaaaaaaaaa1
\'
,
\'
bbbbbbbbbbbbbbbbbbbb1
\'
) ;'
tdLog
.
info
(
cmd1
)
tdSql
.
error
(
cmd1
)
try
:
tdSql
.
execute
(
cmd1
)
tdLog
.
exit
(
"string data overflow"
)
except
Exception
as
e
:
tdLog
.
info
(
repr
(
e
))
tdLog
.
info
(
"insert wrong data error catched"
)
tdSql
.
query
(
'select * from length11 order by ts desc'
)
tdSql
.
checkData
(
0
,
1
,
'aaaaaaaaaa'
)
tdSql
.
checkData
(
0
,
2
,
'bbbbbbbbbbbbbbbbbbbb'
)
tdLog
.
info
(
"=============== step1.4,modify columu length "
)
cmd1
=
'alter table length11 modify column lengthbia binary(10) ;'
tdLog
.
info
(
cmd1
)
tdSql
.
error
(
cmd1
)
try
:
tdSql
.
execute
(
cmd1
)
tdLog
.
exit
(
"new column length should be bigger than old one"
)
except
Exception
as
e
:
tdLog
.
info
(
repr
(
e
))
tdLog
.
info
(
"new column length should be bigger than old one"
)
cmd2
=
'alter table length11 modify column lengthnchar nchar(20);'
tdLog
.
info
(
cmd2
)
tdSql
.
error
(
cmd2
)
try
:
tdSql
.
execute
(
cmd2
)
tdLog
.
exit
(
"new column length should be bigger than old one"
)
except
Exception
as
e
:
tdLog
.
info
(
repr
(
e
))
tdLog
.
info
(
"new column length should be bigger than old one"
)
cmd3
=
'alter table length11 modify column lengthbia binary(11) ;'
cmd4
=
'describe length11 ;'
tdLog
.
info
(
cmd3
)
tdSql
.
execute
(
cmd3
)
tdLog
.
info
(
cmd4
)
tdSql
.
execute
(
cmd4
)
tdSql
.
query
(
'describe length11 ;'
)
tdSql
.
checkData
(
1
,
2
,
11
)
cmd5
=
'alter table length11 modify column lengthnchar nchar(21);'
cmd6
=
'describe length11 ;'
tdLog
.
info
(
cmd5
)
tdSql
.
execute
(
cmd5
)
tdLog
.
info
(
cmd6
)
tdSql
.
execute
(
cmd6
)
tdSql
.
query
(
'describe length11 ;'
)
tdSql
.
checkData
(
2
,
2
,
21
)
tdSql
.
query
(
'select * from length11 order by ts desc'
)
tdSql
.
checkData
(
0
,
1
,
'aaaaaaaaaa'
)
tdSql
.
checkData
(
0
,
2
,
'bbbbbbbbbbbbbbbbbbbb'
)
tdLog
.
info
(
"=============== step1.5,insert table right data"
)
cmd1
=
'insert into length11 values(now,
\'
aaaaaaaaaa1
\'
,
\'
bbbbbbbbbbbbbbbbbbbb1
\'
) ;'
tdLog
.
info
(
cmd1
)
tdSql
.
execute
(
cmd1
)
tdSql
.
query
(
'select * from length11 order by ts desc'
)
tdSql
.
checkData
(
0
,
1
,
'aaaaaaaaaa1'
)
tdSql
.
checkData
(
0
,
2
,
'bbbbbbbbbbbbbbbbbbbb1'
)
tdLog
.
info
(
"=============== step2,check stable table and tag"
)
tdLog
.
info
(
"=============== step2.1,drop table && create table"
)
cmd1
=
'drop table if exists length1 ;'
cmd2
=
'drop table if exists length2 ;'
cmd3
=
'drop table if exists length2 ;'
cmd4
=
'drop table if exists lengthsta1 ;'
cmd5
=
'create stable lengthsta1(ts timestamp,lengthbia binary(10),lengthnchar nchar(20)) tags (tlengthbia binary(15),tlengthnchar nchar(25)) ;'
cmd6
=
'create table length1 using lengthsta1 tags(
\'
aaaaabbbbbaaaaa
\'
,
\'
bbbbbaaaaabbbbbaaaaabbbbb
\'
) ; '
tdLog
.
info
(
cmd1
)
tdSql
.
execute
(
cmd1
)
tdLog
.
info
(
cmd2
)
tdSql
.
execute
(
cmd2
)
tdLog
.
info
(
cmd3
)
tdSql
.
execute
(
cmd3
)
tdLog
.
info
(
cmd4
)
tdSql
.
execute
(
cmd4
)
tdLog
.
info
(
cmd5
)
tdSql
.
execute
(
cmd5
)
tdLog
.
info
(
cmd6
)
tdSql
.
execute
(
cmd6
)
tdLog
.
info
(
"=============== step2.2,insert table right data"
)
cmd1
=
'insert into length1 values(now,
\'
aaaaaaaaaa
\'
,
\'
bbbbbbbbbbbbbbbbbbbb
\'
) ;'
tdLog
.
info
(
cmd1
)
tdSql
.
execute
(
cmd1
)
tdSql
.
query
(
'select * from length1 order by ts desc'
)
tdSql
.
checkData
(
0
,
1
,
'aaaaaaaaaa'
)
tdSql
.
checkData
(
0
,
2
,
'bbbbbbbbbbbbbbbbbbbb'
)
tdLog
.
info
(
"=============== step2.3,insert table wrong data"
)
cmd1
=
'insert into length1 values(now,
\'
aaaaaaaaaa1
\'
,
\'
bbbbbbbbbbbbbbbbbbbb1
\'
) ;'
tdLog
.
info
(
cmd1
)
tdSql
.
error
(
cmd1
)
try
:
tdSql
.
execute
(
cmd1
)
tdLog
.
exit
(
"string data overflow"
)
except
Exception
as
e
:
tdLog
.
info
(
repr
(
e
))
tdLog
.
info
(
"insert wrong data error catched"
)
tdSql
.
query
(
'select * from length1 order by ts desc'
)
tdSql
.
checkData
(
0
,
1
,
'aaaaaaaaaa'
)
tdSql
.
checkData
(
0
,
2
,
'bbbbbbbbbbbbbbbbbbbb'
)
tdLog
.
info
(
"=============== step2.4,modify columu length "
)
cmd0
=
'alter table length1 modify column lengthbia binary(10) ;'
tdLog
.
info
(
cmd0
)
tdSql
.
error
(
cmd0
)
try
:
tdSql
.
execute
(
cmd1
)
tdLog
.
exit
(
"invalid operation: column can only be modified by super table"
)
except
Exception
as
e
:
tdLog
.
info
(
repr
(
e
))
tdLog
.
info
(
"invalid operation: column can only be modified by super table"
)
cmd1
=
'alter table lengthsta1 modify column lengthbia binary(10) ;'
tdLog
.
info
(
cmd1
)
tdSql
.
error
(
cmd1
)
try
:
tdSql
.
execute
(
cmd1
)
tdLog
.
exit
(
"new column length should be bigger than old one"
)
except
Exception
as
e
:
tdLog
.
info
(
repr
(
e
))
tdLog
.
info
(
"new column length should be bigger than old one"
)
cmd2
=
'alter table lengthsta1 modify column lengthnchar nchar(20);'
tdLog
.
info
(
cmd2
)
tdSql
.
error
(
cmd2
)
try
:
tdSql
.
execute
(
cmd2
)
tdLog
.
exit
(
"new column length should be bigger than old one"
)
except
Exception
as
e
:
tdLog
.
info
(
repr
(
e
))
tdLog
.
info
(
"new column length should be bigger than old one"
)
cmd3
=
'alter table lengthsta1 modify column lengthbia binary(11) ;'
cmd4
=
'describe lengthsta1 ;'
tdLog
.
info
(
cmd3
)
tdSql
.
execute
(
cmd3
)
tdLog
.
info
(
cmd4
)
tdSql
.
execute
(
cmd4
)
tdSql
.
query
(
'describe length1 ;'
)
tdSql
.
checkData
(
1
,
2
,
11
)
cmd5
=
'alter table lengthsta1 modify column lengthnchar nchar(21);'
cmd6
=
'describe lengthsta1 ;'
tdLog
.
info
(
cmd5
)
tdSql
.
execute
(
cmd5
)
tdLog
.
info
(
cmd6
)
tdSql
.
execute
(
cmd6
)
tdSql
.
query
(
'describe lengthsta1 ;'
)
tdSql
.
checkData
(
2
,
2
,
21
)
tdSql
.
query
(
'select * from lengthsta1 order by ts desc'
)
tdSql
.
checkData
(
0
,
1
,
'aaaaaaaaaa'
)
tdSql
.
checkData
(
0
,
2
,
'bbbbbbbbbbbbbbbbbbbb'
)
tdLog
.
info
(
"=============== step2.5,insert table right data"
)
cmd1
=
'insert into length1 values(now,
\'
aaaaaaaaaa1
\'
,
\'
bbbbbbbbbbbbbbbbbbbb1
\'
) ;'
tdLog
.
info
(
cmd1
)
tdSql
.
execute
(
cmd1
)
tdSql
.
query
(
'select * from length1 order by ts desc'
)
tdSql
.
checkData
(
0
,
1
,
'aaaaaaaaaa1'
)
tdSql
.
checkData
(
0
,
2
,
'bbbbbbbbbbbbbbbbbbbb1'
)
tdLog
.
info
(
"=============== step2.6,create table wrong tag"
)
cmd1
=
'create table length2 using lengthsta1 tags(
\'
aaaaabbbbbaaaaa1
\'
,
\'
bbbbbaaaaabbbbbaaaaabbbbb1
\'
) ;'
tdLog
.
info
(
cmd1
)
tdSql
.
error
(
cmd1
)
try
:
tdSql
.
execute
(
cmd1
)
tdLog
.
exit
(
"invalid operation: tag value too long"
)
except
Exception
as
e
:
tdLog
.
info
(
repr
(
e
))
tdLog
.
info
(
"invalid operation: tag value too long"
)
tdSql
.
query
(
'select * from lengthsta1 order by ts desc'
)
tdSql
.
checkData
(
0
,
1
,
'aaaaaaaaaa1'
)
tdSql
.
checkData
(
0
,
2
,
'bbbbbbbbbbbbbbbbbbbb1'
)
tdLog
.
info
(
"=============== step2.7,modify tag columu length "
)
cmd1
=
'alter table lengthsta1 modify tag tlengthbia binary(15) ;'
tdLog
.
info
(
cmd1
)
tdSql
.
error
(
cmd1
)
try
:
tdSql
.
execute
(
cmd1
)
tdLog
.
exit
(
"new column length should be bigger than old one"
)
except
Exception
as
e
:
tdLog
.
info
(
repr
(
e
))
tdLog
.
info
(
"new column length should be bigger than old one"
)
cmd2
=
'alter table lengthsta1 modify tag tlengthnchar nchar(25);'
tdLog
.
info
(
cmd2
)
tdSql
.
error
(
cmd2
)
try
:
tdSql
.
execute
(
cmd2
)
tdLog
.
exit
(
"new column length should be bigger than old one"
)
except
Exception
as
e
:
tdLog
.
info
(
repr
(
e
))
tdLog
.
info
(
"new column length should be bigger than old one"
)
cmd3
=
'alter table lengthsta1 modify tag tlengthbia binary(16) ;'
cmd4
=
'describe lengthsta1 ;'
tdLog
.
info
(
cmd3
)
tdSql
.
execute
(
cmd3
)
tdLog
.
info
(
cmd4
)
tdSql
.
execute
(
cmd4
)
tdSql
.
query
(
'describe lengthsta1 ;'
)
tdSql
.
checkData
(
3
,
2
,
16
)
cmd5
=
'alter table lengthsta1 modify tag tlengthnchar nchar(26);'
cmd6
=
'describe lengthsta1 ;'
tdLog
.
info
(
cmd5
)
tdSql
.
execute
(
cmd5
)
tdLog
.
info
(
cmd6
)
tdSql
.
execute
(
cmd6
)
tdSql
.
query
(
'describe lengthsta1 ;'
)
tdSql
.
checkData
(
4
,
2
,
26
)
tdSql
.
query
(
'select * from lengthsta1 order by ts desc'
)
tdSql
.
checkData
(
0
,
1
,
'aaaaaaaaaa1'
)
tdSql
.
checkData
(
0
,
2
,
'bbbbbbbbbbbbbbbbbbbb1'
)
tdSql
.
checkData
(
0
,
3
,
'aaaaabbbbbaaaaa'
)
tdSql
.
checkData
(
0
,
4
,
'bbbbbaaaaabbbbbaaaaabbbbb'
)
tdLog
.
info
(
"=============== step2.8,creat tag right data and insert data"
)
cmd1
=
'create table length2 using lengthsta1 tags(
\'
aaaaabbbbbaaaaa1
\'
,
\'
bbbbbaaaaabbbbbaaaaabbbbb1
\'
) ;'
tdLog
.
info
(
cmd1
)
tdSql
.
execute
(
cmd1
)
tdSql
.
query
(
'describe length2 ;'
)
tdSql
.
checkData
(
3
,
2
,
16
)
tdSql
.
checkData
(
4
,
2
,
26
)
cmd2
=
'insert into length2 values(now,
\'
aaaaaaaaaa1
\'
,
\'
bbbbbbbbbbbbbbbbbbbb1
\'
) ;'
tdLog
.
info
(
cmd2
)
tdSql
.
execute
(
cmd2
)
tdSql
.
query
(
'select * from length2 order by ts desc'
)
tdSql
.
checkData
(
0
,
1
,
'aaaaaaaaaa1'
)
tdSql
.
checkData
(
0
,
2
,
'bbbbbbbbbbbbbbbbbbbb1'
)
tdSql
.
query
(
'select * from lengthsta1 order by ts desc'
)
tdSql
.
checkData
(
0
,
1
,
'aaaaaaaaaa1'
)
tdSql
.
checkData
(
0
,
2
,
'bbbbbbbbbbbbbbbbbbbb1'
)
tdSql
.
checkData
(
0
,
3
,
'aaaaabbbbbaaaaa1'
)
tdSql
.
checkData
(
0
,
4
,
'bbbbbaaaaabbbbbaaaaabbbbb1'
)
tdLog
.
info
(
"=============== step2.9,modify tag columu length again "
)
cmd1
=
'alter table lengthsta1 modify tag tlengthbia binary(16) ;'
tdLog
.
info
(
cmd1
)
tdSql
.
error
(
cmd1
)
try
:
tdSql
.
execute
(
cmd1
)
tdLog
.
exit
(
"new column length should be bigger than old one"
)
except
Exception
as
e
:
tdLog
.
info
(
repr
(
e
))
tdLog
.
info
(
"new column length should be bigger than old one"
)
cmd2
=
'alter table lengthsta1 modify tag tlengthnchar nchar(26);'
tdLog
.
info
(
cmd2
)
tdSql
.
error
(
cmd2
)
try
:
tdSql
.
execute
(
cmd2
)
tdLog
.
exit
(
"new column length should be bigger than old one"
)
except
Exception
as
e
:
tdLog
.
info
(
repr
(
e
))
tdLog
.
info
(
"new column length should be bigger than old one"
)
cmd3
=
'alter table lengthsta1 modify tag tlengthbia binary(20) ;'
cmd4
=
'describe lengthsta1 ;'
tdLog
.
info
(
cmd3
)
tdSql
.
execute
(
cmd3
)
tdLog
.
info
(
cmd4
)
tdSql
.
execute
(
cmd4
)
tdSql
.
query
(
'describe lengthsta1 ;'
)
tdSql
.
checkData
(
3
,
2
,
20
)
cmd5
=
'alter table lengthsta1 modify tag tlengthnchar nchar(30);'
cmd6
=
'describe lengthsta1 ;'
tdLog
.
info
(
cmd5
)
tdSql
.
execute
(
cmd5
)
tdLog
.
info
(
cmd6
)
tdSql
.
execute
(
cmd6
)
tdSql
.
query
(
'describe lengthsta1 ;'
)
tdSql
.
checkData
(
4
,
2
,
30
)
tdSql
.
query
(
'select * from lengthsta1 order by ts desc'
)
tdSql
.
checkData
(
0
,
1
,
'aaaaaaaaaa1'
)
tdSql
.
checkData
(
0
,
2
,
'bbbbbbbbbbbbbbbbbbbb1'
)
tdSql
.
checkData
(
0
,
3
,
'aaaaabbbbbaaaaa1'
)
tdSql
.
checkData
(
0
,
4
,
'bbbbbaaaaabbbbbaaaaabbbbb1'
)
tdLog
.
info
(
"=============== step2.10,creat tag right data and insert data again"
)
cmd1
=
'create table length3 using lengthsta1 tags(
\'
aaaaabbbbbaaaaabbbbb
\'
,
\'
bbbbbaaaaabbbbbaaaaabbbbbaaaaa
\'
) ;'
tdLog
.
info
(
cmd1
)
tdSql
.
execute
(
cmd1
)
tdSql
.
query
(
'describe length3 ;'
)
tdSql
.
checkData
(
3
,
2
,
20
)
tdSql
.
checkData
(
4
,
2
,
30
)
cmd2
=
'insert into length3 values(now,
\'
aaaaaaaaaa1
\'
,
\'
bbbbbbbbbbbbbbbbbbbb1
\'
) ;'
tdLog
.
info
(
cmd2
)
tdSql
.
execute
(
cmd2
)
tdSql
.
query
(
'select * from length3 order by ts desc'
)
tdSql
.
checkData
(
0
,
1
,
'aaaaaaaaaa1'
)
tdSql
.
checkData
(
0
,
2
,
'bbbbbbbbbbbbbbbbbbbb1'
)
tdSql
.
query
(
'select * from lengthsta1 order by ts desc'
)
tdSql
.
checkData
(
0
,
1
,
'aaaaaaaaaa1'
)
tdSql
.
checkData
(
0
,
2
,
'bbbbbbbbbbbbbbbbbbbb1'
)
tdSql
.
checkData
(
0
,
3
,
'aaaaabbbbbaaaaabbbbb'
)
tdSql
.
checkData
(
0
,
4
,
'bbbbbaaaaabbbbbaaaaabbbbbaaaaa'
)
def
stop
(
self
):
tdSql
.
close
()
tdLog
.
success
(
"%s successfully executed"
%
__file__
)
tdCases
.
addWindows
(
__file__
,
TDTestCase
())
tdCases
.
addLinux
(
__file__
,
TDTestCase
())
tests/pytest/util/sql.py
浏览文件 @
55757e16
...
...
@@ -18,6 +18,7 @@ import datetime
import
inspect
import
psutil
import
shutil
import
pandas
as
pd
from
util.log
import
*
...
...
@@ -134,25 +135,32 @@ class TDSql:
return
self
.
cursor
.
istype
(
col
,
dataType
)
def
checkData
(
self
,
row
,
col
,
data
):
self
.
checkRowCol
(
row
,
col
)
if
self
.
queryResult
[
row
][
col
]
!=
data
:
if
self
.
cursor
.
istype
(
col
,
"TIMESTAMP"
)
and
self
.
queryResult
[
row
][
col
]
==
datetime
.
datetime
.
fromisoformat
(
data
):
tdLog
.
info
(
"sql:%s, row:%d col:%d data:%s == expect:%s"
%
self
.
checkRowCol
(
row
,
col
)
if
self
.
queryResult
[
row
][
col
]
!=
data
:
if
self
.
cursor
.
istype
(
col
,
"TIMESTAMP"
):
# suppose user want to check nanosecond timestamp if a longer data passed
if
(
len
(
data
)
>=
28
):
if
pd
.
to_datetime
(
self
.
queryResult
[
row
][
col
])
==
pd
.
to_datetime
(
data
):
tdLog
.
info
(
"sql:%s, row:%d col:%d data:%d == expect:%s"
%
(
self
.
sql
,
row
,
col
,
self
.
queryResult
[
row
][
col
],
data
))
else
:
if
self
.
queryResult
[
row
][
col
]
==
datetime
.
datetime
.
fromisoformat
(
data
):
tdLog
.
info
(
"sql:%s, row:%d col:%d data:%s == expect:%s"
%
(
self
.
sql
,
row
,
col
,
self
.
queryResult
[
row
][
col
],
data
))
return
if
str
(
self
.
queryResult
[
row
][
col
])
==
str
(
data
):
tdLog
.
info
(
"sql:%s, row:%d col:%d data:%s == expect:%s"
%
(
self
.
sql
,
row
,
col
,
self
.
queryResult
[
row
][
col
],
data
))
(
self
.
sql
,
row
,
col
,
self
.
queryResult
[
row
][
col
],
data
))
return
elif
isinstance
(
data
,
float
)
and
abs
(
self
.
queryResult
[
row
][
col
]
-
data
)
<=
0.000001
:
elif
isinstance
(
data
,
float
)
and
abs
(
self
.
queryResult
[
row
][
col
]
-
data
)
<=
0.000001
:
tdLog
.
info
(
"sql:%s, row:%d col:%d data:%f == expect:%f"
%
(
self
.
sql
,
row
,
col
,
self
.
queryResult
[
row
][
col
],
data
))
(
self
.
sql
,
row
,
col
,
self
.
queryResult
[
row
][
col
],
data
))
return
else
:
caller
=
inspect
.
getframeinfo
(
inspect
.
stack
()[
1
][
0
])
args
=
(
caller
.
filename
,
caller
.
lineno
,
self
.
sql
,
row
,
col
,
self
.
queryResult
[
row
][
col
],
data
)
tdLog
.
exit
(
"%s(%d) failed: sql:%s row:%d col:%d data:%s != expect:%s"
%
args
)
tdLog
.
exit
(
"%s(%d) failed: sql:%s row:%d col:%d data:%s != expect:%s"
%
args
)
if
data
is
None
:
tdLog
.
info
(
"sql:%s, row:%d col:%d data:%s == expect:%s"
%
...
...
@@ -162,11 +170,11 @@ class TDSql:
(
self
.
sql
,
row
,
col
,
self
.
queryResult
[
row
][
col
],
data
))
elif
isinstance
(
data
,
datetime
.
date
):
tdLog
.
info
(
"sql:%s, row:%d col:%d data:%s == expect:%s"
%
(
self
.
sql
,
row
,
col
,
self
.
queryResult
[
row
][
col
],
data
))
(
self
.
sql
,
row
,
col
,
self
.
queryResult
[
row
][
col
],
data
))
elif
isinstance
(
data
,
float
):
tdLog
.
info
(
"sql:%s, row:%d col:%d data:%s == expect:%s"
%
(
self
.
sql
,
row
,
col
,
self
.
queryResult
[
row
][
col
],
data
))
else
:
else
:
tdLog
.
info
(
"sql:%s, row:%d col:%d data:%s == expect:%d"
%
(
self
.
sql
,
row
,
col
,
self
.
queryResult
[
row
][
col
],
data
))
...
...
@@ -200,7 +208,7 @@ class TDSql:
tdLog
.
exit
(
"%s(%d) failed: sql:%s, affectedRows:%d != expect:%d"
%
args
)
tdLog
.
info
(
"sql:%s, affectedRows:%d == expect:%d"
%
(
self
.
sql
,
self
.
affectedRows
,
expectAffectedRows
))
def
taosdStatus
(
self
,
state
):
tdLog
.
sleep
(
5
)
pstate
=
0
...
...
@@ -221,7 +229,7 @@ class TDSql:
continue
pstate
=
0
break
args
=
(
pstate
,
state
)
if
pstate
==
state
:
tdLog
.
info
(
"taosd state is %d == expect:%d"
%
args
)
...
...
@@ -236,11 +244,11 @@ class TDSql:
tdLog
.
exit
(
"dir: %s is empty, expect: not empty"
%
dir
)
else
:
tdLog
.
info
(
"dir: %s is empty, expect: empty"
%
dir
)
else
:
else
:
if
state
:
tdLog
.
info
(
"dir: %s is not empty, expect: not empty"
%
dir
)
else
:
tdLog
.
exit
(
"dir: %s is not empty, expect: empty"
%
dir
)
tdLog
.
exit
(
"dir: %s is not empty, expect: empty"
%
dir
)
else
:
tdLog
.
exit
(
"dir: %s doesn't exist"
%
dir
)
def
createDir
(
self
,
dir
):
...
...
@@ -250,5 +258,5 @@ class TDSql:
os
.
makedirs
(
dir
,
755
)
tdLog
.
info
(
"dir: %s is created"
%
dir
)
pass
tdSql
=
TDSql
()
tests/script/general/http/grafana_bug.sim
浏览文件 @
55757e16
...
...
@@ -20,17 +20,22 @@ sql use db
sql create table tb (ts timestamp, val int, val1 int, val2 int)
sql create table tb2 (ts timestamp, val int, val1 int, val2 int)
sql create table t2 (ts timestamp, val int)
sql create table tb3 (ts timestamp, val int, val1 int, val2 int)
sql insert into tb values('2020-01-01 00:00:00.000', 1, 11, 21)
sql insert into tb values('2020-01-02 00:00:00.000', 1, 12, 22)
sql insert into tb values('2020-01-03 00:00:00.000', 2, 13, 23)
sql insert into tb values('2020-01-04 00:00:00.000', 2, 14, 24)
sql insert into tb2 values('2020-01-01 00:00:00.000', 21, 211, 221)
sql insert into tb2 values('2020-01-02 00:00:00.000', 21, 212, 222)
sql insert into tb2 values('2020-01-03 00:00:00.000', 22, 213, 223)
sql insert into tb2 values('2020-01-04 00:00:00.000', 22, 214, 224)
sql insert into tb3 values('2020-01-01 00:00:00.000', NULL, NULL, NULL)
sql insert into tb3 values('2020-01-02 00:00:00.000', NULL, NULL, NULL)
print =============== step1 - one query, 1 column, with timestamp
system_content curl -H 'Authorization: Basic cm9vdDp0YW9zZGF0YQ==' -d '[ {"refId":"A","alias":"","sql":"select ts from db.tb where ts >= 1577980800000 "} ]' 127.0.0.1:7111/grafana/query
...
...
@@ -235,4 +240,11 @@ if $system_content != @[{"refId":"B","target":"BB{val2:223,}","datapoints":[[213
return -1
endi
print =============== step26 - 2 column, no timestamp, NULL
system_content curl -H 'Authorization: Basic cm9vdDp0YW9zZGF0YQ==' -d '[ {"refId":"A","alias":"","sql":"select * from db.tb3 "} ]' 127.0.0.1:7111/grafana/query
print step1-> $system_content
if $system_content != @[{"refId":"A","target":"{val1:nil, val2:nil}","datapoints":[[null,1577808000000],[null,1577894400000]]}]@ then
return -1
endi
system sh/exec.sh -n dnode1 -s stop -x SIGINT
\ No newline at end of file
tests/script/general/parser/function.sim
浏览文件 @
55757e16
...
...
@@ -817,6 +817,9 @@ print ====================> TODO stddev + normal column filter
print ====================> irate
sql_error select irate(f1) from st1;
sql select irate(f1) from st1 group by tbname;
sql select irate(k) from t1
if $rows != 1 then
return -1
...
...
@@ -1073,6 +1076,12 @@ sql insert into t0 values('2020-1-1 1:3:9', 9);
sql insert into t0 values('2020-1-1 1:4:10', 10);
sql insert into t1 values('2020-1-1 1:1:2', 2);
print ===========================>td-4739
sql select diff(val) from (select derivative(k, 1s, 0) val from t1);
if $rows != 0 then
return -1
endi
sql insert into t1 values('2020-1-1 1:1:4', 20);
sql insert into t1 values('2020-1-1 1:1:6', 200);
sql insert into t1 values('2020-1-1 1:1:8', 2000);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录