Merge remote-tracking branch 'origin/3.0' into fix/TD-22762
This commit is contained in:
commit
a98ff93c32
|
@ -1,6 +1,13 @@
|
||||||
## TDengine SpringBoot + Mybatis Demo
|
## TDengine SpringBoot + Mybatis Demo
|
||||||
|
|
||||||
## 需要提前创建 test 数据库
|
## 需要提前创建 test 数据库
|
||||||
|
|
||||||
|
```
|
||||||
|
$ taos -s 'create database if not exists test'
|
||||||
|
|
||||||
|
$ curl http://localhost:8080/weather/init
|
||||||
|
```
|
||||||
|
|
||||||
### 配置 application.properties
|
### 配置 application.properties
|
||||||
```properties
|
```properties
|
||||||
# datasource config
|
# datasource config
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
<id column="ts" jdbcType="TIMESTAMP" property="ts"/>
|
<id column="ts" jdbcType="TIMESTAMP" property="ts"/>
|
||||||
<result column="temperature" jdbcType="FLOAT" property="temperature"/>
|
<result column="temperature" jdbcType="FLOAT" property="temperature"/>
|
||||||
<result column="humidity" jdbcType="FLOAT" property="humidity"/>
|
<result column="humidity" jdbcType="FLOAT" property="humidity"/>
|
||||||
|
<result column="bytes" jdbcType="BINARY" property="bytes" />
|
||||||
</resultMap>
|
</resultMap>
|
||||||
|
|
||||||
<select id="lastOne" resultType="java.util.Map">
|
<select id="lastOne" resultType="java.util.Map">
|
||||||
|
@ -36,6 +37,11 @@
|
||||||
binary
|
binary
|
||||||
(
|
(
|
||||||
64
|
64
|
||||||
|
),
|
||||||
|
bytes
|
||||||
|
binary
|
||||||
|
(
|
||||||
|
64
|
||||||
)) tags
|
)) tags
|
||||||
(
|
(
|
||||||
location nchar
|
location nchar
|
||||||
|
@ -63,8 +69,8 @@
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<insert id="insert" parameterType="com.taosdata.example.springbootdemo.domain.Weather">
|
<insert id="insert" parameterType="com.taosdata.example.springbootdemo.domain.Weather">
|
||||||
insert into test.t#{groupId} (ts, temperature, humidity, note)
|
insert into test.t#{groupId} (ts, temperature, humidity, note, bytes)
|
||||||
values (#{ts}, ${temperature}, ${humidity}, #{note})
|
values (#{ts}, ${temperature}, ${humidity}, #{note}, #{bytes})
|
||||||
</insert>
|
</insert>
|
||||||
|
|
||||||
<select id="getSubTables" resultType="String">
|
<select id="getSubTables" resultType="String">
|
||||||
|
|
|
@ -2,6 +2,7 @@ package com.taosdata.example.springbootdemo.domain;
|
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
|
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
|
|
||||||
public class Weather {
|
public class Weather {
|
||||||
|
@ -12,6 +13,9 @@ public class Weather {
|
||||||
private Float humidity;
|
private Float humidity;
|
||||||
private String location;
|
private String location;
|
||||||
private String note;
|
private String note;
|
||||||
|
// In rest mode, the byte[] type is not recommended.
|
||||||
|
// UTF-8 is used to encode the byte arrays, that result may affect the SQL correctness
|
||||||
|
private byte[] bytes;
|
||||||
private int groupId;
|
private int groupId;
|
||||||
|
|
||||||
public Weather() {
|
public Weather() {
|
||||||
|
@ -70,4 +74,30 @@ public class Weather {
|
||||||
public void setNote(String note) {
|
public void setNote(String note) {
|
||||||
this.note = note;
|
this.note = note;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public byte[] getBytes() {
|
||||||
|
return bytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBytes(byte[] bytes) {
|
||||||
|
this.bytes = bytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
final StringBuilder sb = new StringBuilder("Weather{");
|
||||||
|
sb.append("ts=").append(ts);
|
||||||
|
sb.append(", temperature=").append(temperature);
|
||||||
|
sb.append(", humidity=").append(humidity);
|
||||||
|
sb.append(", location='").append(location).append('\'');
|
||||||
|
sb.append(", note='").append(note).append('\'');
|
||||||
|
sb.append(", bytes -> string=");
|
||||||
|
if (bytes == null) sb.append("null");
|
||||||
|
else {
|
||||||
|
sb.append(new String(bytes, StandardCharsets.UTF_8));
|
||||||
|
}
|
||||||
|
sb.append(", groupId=").append(groupId);
|
||||||
|
sb.append('}');
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ import com.taosdata.example.springbootdemo.domain.Weather;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -30,6 +31,7 @@ public class WeatherService {
|
||||||
weather.setLocation(locations[random.nextInt(locations.length)]);
|
weather.setLocation(locations[random.nextInt(locations.length)]);
|
||||||
weather.setGroupId(i % locations.length);
|
weather.setGroupId(i % locations.length);
|
||||||
weather.setNote("note-" + i);
|
weather.setNote("note-" + i);
|
||||||
|
weather.setBytes(locations[random.nextInt(locations.length)].getBytes(StandardCharsets.UTF_8));
|
||||||
weatherMapper.createTable(weather);
|
weatherMapper.createTable(weather);
|
||||||
count += weatherMapper.insert(weather);
|
count += weatherMapper.insert(weather);
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,9 +29,12 @@ extern "C" {
|
||||||
#define calloc CALLOC_FUNC_TAOS_FORBID
|
#define calloc CALLOC_FUNC_TAOS_FORBID
|
||||||
#define realloc REALLOC_FUNC_TAOS_FORBID
|
#define realloc REALLOC_FUNC_TAOS_FORBID
|
||||||
#define free FREE_FUNC_TAOS_FORBID
|
#define free FREE_FUNC_TAOS_FORBID
|
||||||
|
#ifdef strdup
|
||||||
|
#undef strdup
|
||||||
#define strdup STRDUP_FUNC_TAOS_FORBID
|
#define strdup STRDUP_FUNC_TAOS_FORBID
|
||||||
#endif // ifndef ALLOW_FORBID_FUNC
|
#endif
|
||||||
|
|
||||||
|
#endif // ifndef ALLOW_FORBID_FUNC
|
||||||
#endif // if !defined(WINDOWS)
|
#endif // if !defined(WINDOWS)
|
||||||
|
|
||||||
int32_t taosMemoryDbgInit();
|
int32_t taosMemoryDbgInit();
|
||||||
|
|
|
@ -99,6 +99,9 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_tmq_TMQConnector_tmqCommitSync(JNI
|
||||||
*/
|
*/
|
||||||
JNIEXPORT void JNICALL Java_com_taosdata_jdbc_tmq_TMQConnector_tmqCommitAsync(JNIEnv *, jobject, jlong, jlong, jobject);
|
JNIEXPORT void JNICALL Java_com_taosdata_jdbc_tmq_TMQConnector_tmqCommitAsync(JNIEnv *, jobject, jlong, jlong, jobject);
|
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_com_taosdata_jdbc_tmq_TMQConnector_consumerCommitAsync(JNIEnv *, jobject, jlong, jlong,
|
||||||
|
jobject);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Class: com_taosdata_jdbc_tmq_TMQConnector
|
* Class: com_taosdata_jdbc_tmq_TMQConnector
|
||||||
* Method: tmqUnsubscribeImp
|
* Method: tmqUnsubscribeImp
|
||||||
|
|
|
@ -56,6 +56,7 @@ jmethodID g_createConsumerErrorCallback;
|
||||||
jmethodID g_topicListCallback;
|
jmethodID g_topicListCallback;
|
||||||
|
|
||||||
jclass g_consumerClass;
|
jclass g_consumerClass;
|
||||||
|
// deprecated
|
||||||
jmethodID g_commitCallback;
|
jmethodID g_commitCallback;
|
||||||
|
|
||||||
void jniGetGlobalMethod(JNIEnv *env) {
|
void jniGetGlobalMethod(JNIEnv *env) {
|
||||||
|
|
|
@ -17,6 +17,36 @@
|
||||||
#include "jniCommon.h"
|
#include "jniCommon.h"
|
||||||
#include "taos.h"
|
#include "taos.h"
|
||||||
|
|
||||||
|
int __init_tmq = 0;
|
||||||
|
jmethodID g_offsetCallback;
|
||||||
|
|
||||||
|
void tmqGlobalMethod(JNIEnv *env) {
|
||||||
|
// make sure init function executed once
|
||||||
|
switch (atomic_val_compare_exchange_32(&__init_tmq, 0, 1)) {
|
||||||
|
case 0:
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
do {
|
||||||
|
taosMsleep(0);
|
||||||
|
} while (atomic_load_32(&__init_tmq) == 1);
|
||||||
|
case 2:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_vm == NULL) {
|
||||||
|
(*env)->GetJavaVM(env, &g_vm);
|
||||||
|
}
|
||||||
|
|
||||||
|
jclass offset = (*env)->FindClass(env, "com/taosdata/jdbc/tmq/OffsetWaitCallback");
|
||||||
|
jclass g_offsetCallbackClass = (*env)->NewGlobalRef(env, offset);
|
||||||
|
g_offsetCallback = (*env)->GetMethodID(env, g_offsetCallbackClass, "commitCallbackHandler", "(I)V");
|
||||||
|
(*env)->DeleteLocalRef(env, offset);
|
||||||
|
|
||||||
|
atomic_store_32(&__init_tmq, 2);
|
||||||
|
jniDebug("tmq method register finished");
|
||||||
|
}
|
||||||
|
|
||||||
|
// deprecated
|
||||||
void commit_cb(tmq_t *tmq, int32_t code, void *param) {
|
void commit_cb(tmq_t *tmq, int32_t code, void *param) {
|
||||||
JNIEnv *env = NULL;
|
JNIEnv *env = NULL;
|
||||||
int status = (*g_vm)->GetEnv(g_vm, (void **)&env, JNI_VERSION_1_6);
|
int status = (*g_vm)->GetEnv(g_vm, (void **)&env, JNI_VERSION_1_6);
|
||||||
|
@ -40,6 +70,28 @@ void commit_cb(tmq_t *tmq, int32_t code, void *param) {
|
||||||
env = NULL;
|
env = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void consumer_callback(tmq_t *tmq, int32_t code, void *param) {
|
||||||
|
JNIEnv *env = NULL;
|
||||||
|
int status = (*g_vm)->GetEnv(g_vm, (void **)&env, JNI_VERSION_1_6);
|
||||||
|
bool needDetach = false;
|
||||||
|
if (status < 0) {
|
||||||
|
if ((*g_vm)->AttachCurrentThread(g_vm, (void **)&env, NULL) != 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
needDetach = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
jobject obj = (jobject)param;
|
||||||
|
(*env)->CallVoidMethod(env, obj, g_offsetCallback, code);
|
||||||
|
(*env)->DeleteGlobalRef(env, obj);
|
||||||
|
param = NULL;
|
||||||
|
|
||||||
|
if (needDetach) {
|
||||||
|
(*g_vm)->DetachCurrentThread(g_vm);
|
||||||
|
}
|
||||||
|
env = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
JNIEXPORT jlong JNICALL Java_com_taosdata_jdbc_tmq_TMQConnector_tmqConfNewImp(JNIEnv *env, jobject jobj) {
|
JNIEXPORT jlong JNICALL Java_com_taosdata_jdbc_tmq_TMQConnector_tmqConfNewImp(JNIEnv *env, jobject jobj) {
|
||||||
tmq_conf_t *conf = tmq_conf_new();
|
tmq_conf_t *conf = tmq_conf_new();
|
||||||
jniGetGlobalMethod(env);
|
jniGetGlobalMethod(env);
|
||||||
|
@ -201,6 +253,7 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_tmq_TMQConnector_tmqCommitSync(JNI
|
||||||
return tmq_commit_sync(tmq, res);
|
return tmq_commit_sync(tmq, res);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// deprecated
|
||||||
JNIEXPORT void JNICALL Java_com_taosdata_jdbc_tmq_TMQConnector_tmqCommitAsync(JNIEnv *env, jobject jobj, jlong jtmq,
|
JNIEXPORT void JNICALL Java_com_taosdata_jdbc_tmq_TMQConnector_tmqCommitAsync(JNIEnv *env, jobject jobj, jlong jtmq,
|
||||||
jlong jres, jobject consumer) {
|
jlong jres, jobject consumer) {
|
||||||
tmq_t *tmq = (tmq_t *)jtmq;
|
tmq_t *tmq = (tmq_t *)jtmq;
|
||||||
|
@ -213,6 +266,19 @@ JNIEXPORT void JNICALL Java_com_taosdata_jdbc_tmq_TMQConnector_tmqCommitAsync(JN
|
||||||
tmq_commit_async(tmq, res, commit_cb, consumer);
|
tmq_commit_async(tmq, res, commit_cb, consumer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_com_taosdata_jdbc_tmq_TMQConnector_consumerCommitAsync(JNIEnv *env, jobject jobj, jlong jtmq,
|
||||||
|
jlong jres, jobject offset) {
|
||||||
|
tmqGlobalMethod(env);
|
||||||
|
tmq_t *tmq = (tmq_t *)jtmq;
|
||||||
|
if (tmq == NULL) {
|
||||||
|
jniError("jobj:%p, tmq is closed", jobj);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
TAOS_RES *res = (TAOS_RES *)jres;
|
||||||
|
offset = (*env)->NewGlobalRef(env, offset);
|
||||||
|
tmq_commit_async(tmq, res, consumer_callback, offset);
|
||||||
|
}
|
||||||
|
|
||||||
JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_tmq_TMQConnector_tmqUnsubscribeImp(JNIEnv *env, jobject jobj,
|
JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_tmq_TMQConnector_tmqUnsubscribeImp(JNIEnv *env, jobject jobj,
|
||||||
jlong jtmq) {
|
jlong jtmq) {
|
||||||
tmq_t *tmq = (tmq_t *)jtmq;
|
tmq_t *tmq = (tmq_t *)jtmq;
|
||||||
|
|
|
@ -468,7 +468,7 @@ size_t tstrncspn(const char *str, size_t size, const char *reject, size_t rsize)
|
||||||
c3 = p[s[j + 3]];
|
c3 = p[s[j + 3]];
|
||||||
|
|
||||||
if ((c0 | c1 | c2 | c3) != 0) {
|
if ((c0 | c1 | c2 | c3) != 0) {
|
||||||
size_t count = ((i + 1) >> 2);
|
size_t count = i * 4;
|
||||||
return (c0 | c1) != 0 ? count - c0 + 1 : count - c2 + 3;
|
return (c0 | c1) != 0 ? count - c0 + 1 : count - c2 + 3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -294,6 +294,10 @@ TEST(utilTest, tstrncspn) {
|
||||||
const char* reject5 = "911";
|
const char* reject5 = "911";
|
||||||
v = tstrncspn(p2, strlen(p2), reject5, 0);
|
v = tstrncspn(p2, strlen(p2), reject5, 0);
|
||||||
ASSERT_EQ(v, 14);
|
ASSERT_EQ(v, 14);
|
||||||
|
|
||||||
|
const char* reject6 = "Kk";
|
||||||
|
v = tstrncspn(p2, strlen(p2), reject6, 2);
|
||||||
|
ASSERT_EQ(v, 10);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(utilTest, intToHextStr) {
|
TEST(utilTest, intToHextStr) {
|
||||||
|
@ -322,4 +326,4 @@ TEST(utilTest, intToHextStr) {
|
||||||
sprintf(destBuf, "%" PRIx64, v);
|
sprintf(destBuf, "%" PRIx64, v);
|
||||||
ASSERT_STREQ(buf, destBuf);
|
ASSERT_STREQ(buf, destBuf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -168,6 +168,7 @@
|
||||||
,,y,script,./test.sh -f tsim/parser/union.sim
|
,,y,script,./test.sh -f tsim/parser/union.sim
|
||||||
,,y,script,./test.sh -f tsim/parser/union_sysinfo.sim
|
,,y,script,./test.sh -f tsim/parser/union_sysinfo.sim
|
||||||
,,y,script,./test.sh -f tsim/parser/where.sim
|
,,y,script,./test.sh -f tsim/parser/where.sim
|
||||||
|
,,y,script,./test.sh -f tsim/query/tagLikeFilter.sim
|
||||||
,,y,script,./test.sh -f tsim/query/charScalarFunction.sim
|
,,y,script,./test.sh -f tsim/query/charScalarFunction.sim
|
||||||
,,y,script,./test.sh -f tsim/query/explain.sim
|
,,y,script,./test.sh -f tsim/query/explain.sim
|
||||||
,,y,script,./test.sh -f tsim/query/interval-offset.sim
|
,,y,script,./test.sh -f tsim/query/interval-offset.sim
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
system sh/stop_dnodes.sh
|
||||||
|
system sh/deploy.sh -n dnode1 -i 1
|
||||||
|
system sh/exec.sh -n dnode1 -s start
|
||||||
|
sql connect
|
||||||
|
|
||||||
|
sql drop database if exists db1;
|
||||||
|
sql create database if not exists db1 vgroups 10;
|
||||||
|
sql use db1;
|
||||||
|
sql create stable sta (ts timestamp, f1 double, f2 binary(200)) tags(t1 binary(100));
|
||||||
|
sql create table tba1 using sta tags('ZQMPvstuzZVzCRjFTQawILuGSqZKSqlJwcBtZMxrAEqBbzChHWVDMiAZJwESzJAf');
|
||||||
|
sql create table tba2 using sta tags('ieofwehughkreghughuerugu34jf9340aieefjalie28ffj8fj8fafjaekdfjfii');
|
||||||
|
sql create table tba3 using sta tags('ZQMPvstuzZVzCRjFTQawILuGSqabSqlJwcBtZMxrAEqBbzChHWVDMiAZJwESzJAf');
|
||||||
|
sql insert into tba1 values ('2022-04-26 15:15:01', 1.0, "a");
|
||||||
|
sql insert into tba2 values ('2022-04-26 15:15:01', 1.0, "a");
|
||||||
|
sql insert into tba2 values ('2022-04-26 15:15:02', 1.0, "a");
|
||||||
|
sql insert into tba3 values ('2022-04-26 15:15:01', 1.0, "a");
|
||||||
|
sql insert into tba3 values ('2022-04-26 15:15:02', 1.0, "a");
|
||||||
|
sql insert into tba3 values ('2022-04-26 15:15:03', 1.0, "a");
|
||||||
|
sql select t1 from sta where t1 like '%ab%';
|
||||||
|
if $rows != 3 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
sql select t1 from sta where t1 like '%ax%';
|
||||||
|
if $rows != 0 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
sql select t1 from sta where t1 like '%cd%';
|
||||||
|
if $rows != 0 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
sql select t1 from sta where t1 like '%ii';
|
||||||
|
if $rows != 2 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
Loading…
Reference in New Issue