diff --git a/.appveyor.yml b/.appveyor.yml
index fe4816688b..ee1dc91767 100644
--- a/.appveyor.yml
+++ b/.appveyor.yml
@@ -1,30 +1,49 @@
version: 1.0.{build}
-os: Visual Studio 2015
+image:
+ - Visual Studio 2015
+ - macos
environment:
matrix:
- ARCH: amd64
- ARCH: x86
+matrix:
+ exclude:
+ - image: macos
+ ARCH: x86
+for:
+ -
+ matrix:
+ only:
+ - image: Visual Studio 2015
+ clone_folder: c:\dev\TDengine
+ clone_depth: 1
-clone_folder: c:\dev\TDengine
-clone_depth: 1
+ init:
+ - call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" %ARCH%
-init:
- - call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" %ARCH%
+ before_build:
+ - cd c:\dev\TDengine
+ - md build
-before_build:
- - cd c:\dev\TDengine
- - md build
-
-build_script:
- - cd build
- - cmake -G "NMake Makefiles" ..
- - nmake install
+ build_script:
+ - cd build
+ - cmake -G "NMake Makefiles" ..
+ - nmake install
+ -
+ matrix:
+ only:
+ - image: macos
+ clone_depth: 1
+ build_script:
+ - mkdir debug
+ - cd debug
+ - cmake .. > /dev/null
+ - make > /dev/null
notifications:
- provider: Email
to:
- sangshuduo@gmail.com
-
on_build_success: true
on_build_failure: true
on_build_status_changed: true
diff --git a/.drone.yml b/.drone.yml
new file mode 100644
index 0000000000..b71b99e488
--- /dev/null
+++ b/.drone.yml
@@ -0,0 +1,188 @@
+---
+kind: pipeline
+name: test_amd64
+
+platform:
+ os: linux
+ arch: amd64
+
+steps:
+- name: build
+ image: gcc
+ commands:
+ - apt-get update
+ - apt-get install -y cmake build-essential
+ - mkdir debug
+ - cd debug
+ - cmake ..
+ - make
+ when:
+ branch:
+ - develop
+ - master
+
+- name: smoke_test
+ image: python:3.8
+ commands:
+ - pip3 install psutil
+ - pip3 install guppy3
+ - pip3 install src/connector/python/linux/python3/
+ - cd tests
+ - ./test-all.sh smoke
+ when:
+ branch:
+ - develop
+ - master
+
+
+- name: crash_gen
+ image: python:3.8
+ commands:
+ - pip3 install requests
+ - pip3 install src/connector/python/linux/python3/
+ - pip3 install psutil
+ - pip3 install guppy3
+ - cd tests/pytest
+ - ./crash_gen.sh -a -p -t 4 -s 2000
+ when:
+ branch:
+ - develop
+ - master
+
+
+---
+kind: pipeline
+name: test_arm64
+
+platform:
+ os: linux
+ arch: arm64
+
+steps:
+- name: build
+ image: gcc
+ commands:
+ - apt-get update
+ - apt-get install -y cmake build-essential
+ - mkdir debug
+ - cd debug
+ - cmake .. -DCPUTYPE=aarch64 > /dev/null
+ - make
+ when:
+ branch:
+ - develop
+ - master
+---
+kind: pipeline
+name: test_arm
+
+platform:
+ os: linux
+ arch: arm
+
+steps:
+- name: build
+ image: arm32v7/ubuntu:bionic
+ commands:
+ - apt-get update
+ - apt-get install -y cmake build-essential
+ - mkdir debug
+ - cd debug
+ - cmake .. -DCPUTYPE=aarch32 > /dev/null
+ - make
+ when:
+ branch:
+ - develop
+ - master
+
+---
+kind: pipeline
+name: build_trusty
+
+platform:
+ os: linux
+ arch: amd64
+
+steps:
+- name: build
+ image: ubuntu:trusty
+ commands:
+ - apt-get update
+ - apt-get install -y gcc cmake3 build-essential git binutils-2.26
+
+ - mkdir debug
+ - cd debug
+ - cmake ..
+ - make
+ when:
+ branch:
+ - develop
+ - master
+
+---
+kind: pipeline
+name: build_xenial
+
+platform:
+ os: linux
+ arch: amd64
+
+steps:
+- name: build
+ image: ubuntu:xenial
+ commands:
+ - apt-get update
+ - apt-get install -y gcc cmake build-essential
+ - mkdir debug
+ - cd debug
+ - cmake ..
+ - make
+ when:
+ branch:
+ - develop
+ - master
+
+---
+kind: pipeline
+name: build_bionic
+platform:
+ os: linux
+ arch: amd64
+
+steps:
+- name: build
+ image: ubuntu:bionic
+ commands:
+ - apt-get update
+ - apt-get install -y gcc cmake build-essential
+ - mkdir debug
+ - cd debug
+ - cmake ..
+ - make
+ when:
+ branch:
+ - develop
+ - master
+
+---
+kind: pipeline
+name: goodbye
+
+platform:
+ os: linux
+ arch: amd64
+
+steps:
+- name: 64-bit
+ image: alpine
+ commands:
+ - echo 64-bit is good.
+ when:
+ branch:
+ - develop
+ - master
+
+
+depends_on:
+- test_arm64
+- test_amd64
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
index 0617d75976..efe7917105 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -13,7 +13,7 @@ branches:
matrix:
- os: linux
- dist: focal
+ dist: bionic
language: c
git:
@@ -28,8 +28,8 @@ matrix:
- build-essential
- cmake
- net-tools
- - python3-pip
- - python3-setuptools
+ - python3.8
+ - libc6-dbg
- valgrind
- psmisc
- unixodbc
@@ -39,6 +39,8 @@ matrix:
before_script:
- export TZ=Asia/Harbin
- date
+ - curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py && python3.8 get-pip.py
+ - python3.8 -m pip install --upgrade pip setuptools
- cd ${TRAVIS_BUILD_DIR}
- mkdir debug
- cd debug
diff --git a/README.md b/README.md
index 45a955f458..78f902babe 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-[](https://travis-ci.org/taosdata/TDengine)
+[](https://cloud.drone.io/taosdata/TDengine)
[](https://ci.appveyor.com/project/sangshuduo/tdengine-2n8ge/branch/master)
[](https://coveralls.io/github/taosdata/TDengine?branch=develop)
[](https://bestpractices.coreinfrastructure.org/projects/4201)
diff --git a/cmake/install.inc b/cmake/install.inc
index 5823ef743e..9e325531d5 100755
--- a/cmake/install.inc
+++ b/cmake/install.inc
@@ -32,7 +32,7 @@ ELSEIF (TD_WINDOWS)
#INSTALL(TARGETS taos RUNTIME DESTINATION driver)
#INSTALL(TARGETS shell RUNTIME DESTINATION .)
IF (TD_MVN_INSTALLED)
- INSTALL(FILES ${LIBRARY_OUTPUT_PATH}/taos-jdbcdriver-2.0.25-dist.jar DESTINATION connector/jdbc)
+ INSTALL(FILES ${LIBRARY_OUTPUT_PATH}/taos-jdbcdriver-2.0.28-dist.jar DESTINATION connector/jdbc)
ENDIF ()
ELSEIF (TD_DARWIN)
SET(TD_MAKE_INSTALL_SH "${TD_COMMUNITY_DIR}/packaging/tools/make_install.sh")
diff --git a/cmake/version.inc b/cmake/version.inc
index 8035b31cc7..a560c7f598 100755
--- a/cmake/version.inc
+++ b/cmake/version.inc
@@ -4,7 +4,7 @@ PROJECT(TDengine)
IF (DEFINED VERNUMBER)
SET(TD_VER_NUMBER ${VERNUMBER})
ELSE ()
- SET(TD_VER_NUMBER "2.0.20.0")
+ SET(TD_VER_NUMBER "2.0.20.2")
ENDIF ()
IF (DEFINED VERCOMPATIBLE)
diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml
index 31343ed293..9c7400c616 100644
--- a/snap/snapcraft.yaml
+++ b/snap/snapcraft.yaml
@@ -1,6 +1,6 @@
name: tdengine
base: core18
-version: '2.0.20.0'
+version: '2.0.20.2'
icon: snap/gui/t-dengine.svg
summary: an open-source big data platform designed and optimized for IoT.
description: |
@@ -72,7 +72,7 @@ parts:
- usr/bin/taosd
- usr/bin/taos
- usr/bin/taosdemo
- - usr/lib/libtaos.so.2.0.20.0
+ - usr/lib/libtaos.so.2.0.20.2
- usr/lib/libtaos.so.1
- usr/lib/libtaos.so
diff --git a/src/client/inc/tscUtil.h b/src/client/inc/tscUtil.h
index 0eda49b1f4..481a0a4d22 100644
--- a/src/client/inc/tscUtil.h
+++ b/src/client/inc/tscUtil.h
@@ -168,7 +168,8 @@ void tscFieldInfoClear(SFieldInfo* pFieldInfo);
static FORCE_INLINE int32_t tscNumOfFields(SQueryInfo* pQueryInfo) { return pQueryInfo->fieldsInfo.numOfOutput; }
-int32_t tscFieldInfoCompare(const SFieldInfo* pFieldInfo1, const SFieldInfo* pFieldInfo2);
+int32_t tscFieldInfoCompare(const SFieldInfo* pFieldInfo1, const SFieldInfo* pFieldInfo2, int32_t *diffSize);
+int32_t tscFieldInfoSetSize(const SFieldInfo* pFieldInfo1, const SFieldInfo* pFieldInfo2);
void addExprParams(SSqlExpr* pExpr, char* argument, int32_t type, int32_t bytes);
diff --git a/src/client/src/tscSQLParser.c b/src/client/src/tscSQLParser.c
index 751c4bf39f..4cf1423c43 100644
--- a/src/client/src/tscSQLParser.c
+++ b/src/client/src/tscSQLParser.c
@@ -642,17 +642,25 @@ int32_t tscToSQLCmd(SSqlObj* pSql, struct SSqlInfo* pInfo) {
// set the command/global limit parameters from the first subclause to the sqlcmd object
SQueryInfo* pQueryInfo1 = tscGetQueryInfoDetail(pCmd, 0);
pCmd->command = pQueryInfo1->command;
-
+ int32_t diffSize = 0;
+
// if there is only one element, the limit of clause is the limit of global result.
for (int32_t i = 1; i < pCmd->numOfClause; ++i) {
SQueryInfo* pQueryInfo2 = tscGetQueryInfoDetail(pCmd, i);
- int32_t ret = tscFieldInfoCompare(&pQueryInfo1->fieldsInfo, &pQueryInfo2->fieldsInfo);
+ int32_t ret = tscFieldInfoCompare(&pQueryInfo1->fieldsInfo, &pQueryInfo2->fieldsInfo, &diffSize);
if (ret != 0) {
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg1);
}
}
+ if (diffSize) {
+ for (int32_t i = 1; i < pCmd->numOfClause; ++i) {
+ SQueryInfo* pQueryInfo2 = tscGetQueryInfoDetail(pCmd, i);
+ tscFieldInfoSetSize(&pQueryInfo1->fieldsInfo, &pQueryInfo2->fieldsInfo);
+ }
+ }
+
pCmd->parseFinished = 1;
return TSDB_CODE_SUCCESS; // do not build query message here
}
@@ -1606,6 +1614,22 @@ bool isValidDistinctSql(SQueryInfo* pQueryInfo) {
return false;
}
+static bool hasNoneUserDefineExpr(SQueryInfo* pQueryInfo) {
+ size_t numOfExprs = taosArrayGetSize(pQueryInfo->exprList);
+ for (int32_t i = 0; i < numOfExprs; ++i) {
+ SSqlExpr* pExpr = taosArrayGetP(pQueryInfo->exprList, i);
+
+ if (TSDB_COL_IS_UD_COL(pExpr->colInfo.flag)) {
+ continue;
+ }
+
+ return true;
+ }
+
+ return false;
+}
+
+
int32_t parseSelectClause(SSqlCmd* pCmd, int32_t clauseIndex, SArray* pSelectList, bool isSTable, bool joinQuery, bool timeWindowQuery) {
assert(pSelectList != NULL && pCmd != NULL);
const char* msg1 = "too many columns in selection clause";
@@ -1670,7 +1694,7 @@ int32_t parseSelectClause(SSqlCmd* pCmd, int32_t clauseIndex, SArray* pSelectLis
// there is only one user-defined column in the final result field, add the timestamp column.
size_t numOfSrcCols = taosArrayGetSize(pQueryInfo->colList);
- if (numOfSrcCols <= 0 && !tscQueryTags(pQueryInfo) && !tscQueryBlockInfo(pQueryInfo)) {
+ if ((numOfSrcCols <= 0 || !hasNoneUserDefineExpr(pQueryInfo)) && !tscQueryTags(pQueryInfo) && !tscQueryBlockInfo(pQueryInfo)) {
addPrimaryTsColIntoResult(pQueryInfo);
}
diff --git a/src/client/src/tscUtil.c b/src/client/src/tscUtil.c
index fa9e53b0a6..e8d7d5d03c 100644
--- a/src/client/src/tscUtil.c
+++ b/src/client/src/tscUtil.c
@@ -1098,7 +1098,7 @@ int16_t tscFieldInfoGetOffset(SQueryInfo* pQueryInfo, int32_t index) {
return pInfo->pSqlExpr->offset;
}
-int32_t tscFieldInfoCompare(const SFieldInfo* pFieldInfo1, const SFieldInfo* pFieldInfo2) {
+int32_t tscFieldInfoCompare(const SFieldInfo* pFieldInfo1, const SFieldInfo* pFieldInfo2, int32_t *diffSize) {
assert(pFieldInfo1 != NULL && pFieldInfo2 != NULL);
if (pFieldInfo1->numOfOutput != pFieldInfo2->numOfOutput) {
@@ -1110,15 +1110,36 @@ int32_t tscFieldInfoCompare(const SFieldInfo* pFieldInfo1, const SFieldInfo* pFi
TAOS_FIELD* pField2 = tscFieldInfoGetField((SFieldInfo*) pFieldInfo2, i);
if (pField1->type != pField2->type ||
- pField1->bytes != pField2->bytes ||
strcasecmp(pField1->name, pField2->name) != 0) {
return 1;
}
+
+ if (pField1->bytes != pField2->bytes) {
+ *diffSize = 1;
+
+ if (pField2->bytes > pField1->bytes) {
+ pField1->bytes = pField2->bytes;
+ }
+ }
}
return 0;
}
+int32_t tscFieldInfoSetSize(const SFieldInfo* pFieldInfo1, const SFieldInfo* pFieldInfo2) {
+ assert(pFieldInfo1 != NULL && pFieldInfo2 != NULL);
+
+ for (int32_t i = 0; i < pFieldInfo1->numOfOutput; ++i) {
+ TAOS_FIELD* pField1 = tscFieldInfoGetField((SFieldInfo*) pFieldInfo1, i);
+ TAOS_FIELD* pField2 = tscFieldInfoGetField((SFieldInfo*) pFieldInfo2, i);
+
+ pField2->bytes = pField1->bytes;
+ }
+
+ return 0;
+}
+
+
int32_t tscGetResRowLength(SArray* pExprList) {
size_t num = taosArrayGetSize(pExprList);
if (num == 0) {
@@ -2682,7 +2703,13 @@ void tscTryQueryNextClause(SSqlObj* pSql, __async_cb_func_t fp) {
//backup the total number of result first
int64_t num = pRes->numOfTotal + pRes->numOfClauseTotal;
+
+
+ // DON't free final since it may be recoreded and used later in APP
+ TAOS_FIELD* finalBk = pRes->final;
+ pRes->final = NULL;
tscFreeSqlResult(pSql);
+ pRes->final = finalBk;
pRes->numOfTotal = num;
diff --git a/src/connector/jdbc/CMakeLists.txt b/src/connector/jdbc/CMakeLists.txt
index eb158b1f76..de4b8f6bfb 100644
--- a/src/connector/jdbc/CMakeLists.txt
+++ b/src/connector/jdbc/CMakeLists.txt
@@ -8,7 +8,7 @@ IF (TD_MVN_INSTALLED)
ADD_CUSTOM_COMMAND(OUTPUT ${JDBC_CMD_NAME}
POST_BUILD
COMMAND mvn -Dmaven.test.skip=true install -f ${CMAKE_CURRENT_SOURCE_DIR}/pom.xml
- COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/target/taos-jdbcdriver-2.0.25-dist.jar ${LIBRARY_OUTPUT_PATH}
+ COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/target/taos-jdbcdriver-2.0.28-dist.jar ${LIBRARY_OUTPUT_PATH}
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})
diff --git a/src/connector/jdbc/deploy-pom.xml b/src/connector/jdbc/deploy-pom.xml
index eb8c92575c..a31796ffde 100755
--- a/src/connector/jdbc/deploy-pom.xml
+++ b/src/connector/jdbc/deploy-pom.xml
@@ -5,7 +5,7 @@
com.taosdata.jdbc
taos-jdbcdriver
- 2.0.25
+ 2.0.28
jar
JDBCDriver
diff --git a/src/connector/jdbc/pom.xml b/src/connector/jdbc/pom.xml
index 1f75754b0c..3400a82e73 100755
--- a/src/connector/jdbc/pom.xml
+++ b/src/connector/jdbc/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.taosdata.jdbc
taos-jdbcdriver
- 2.0.25
+ 2.0.28
jar
JDBCDriver
https://github.com/taosdata/TDengine/tree/master/src/connector/jdbc
diff --git a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/AbstractConnection.java b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/AbstractConnection.java
index 976078da95..2970f6c2d3 100644
--- a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/AbstractConnection.java
+++ b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/AbstractConnection.java
@@ -4,13 +4,23 @@ import java.sql.*;
import java.util.Enumeration;
import java.util.Map;
import java.util.Properties;
+import java.util.Set;
import java.util.concurrent.*;
public abstract class AbstractConnection extends WrapperImpl implements Connection {
protected volatile boolean isClosed;
protected volatile String catalog;
- protected volatile Properties clientInfoProps = new Properties();
+ protected final Properties clientInfoProps = new Properties();
+
+ protected AbstractConnection(Properties properties) {
+ Set propNames = properties.stringPropertyNames();
+ for (String propName : propNames) {
+ clientInfoProps.setProperty(propName, properties.getProperty(propName));
+ }
+ String timestampFormat = properties.getProperty(TSDBDriver.PROPERTY_KEY_TIMESTAMP_FORMAT, "STRING");
+ clientInfoProps.setProperty(TSDBDriver.PROPERTY_KEY_TIMESTAMP_FORMAT, timestampFormat);
+ }
@Override
public abstract Statement createStatement() throws SQLException;
@@ -35,7 +45,6 @@ public abstract class AbstractConnection extends WrapperImpl implements Connecti
}
-
@Override
public void setAutoCommit(boolean autoCommit) throws SQLException {
if (isClosed())
@@ -441,9 +450,8 @@ public abstract class AbstractConnection extends WrapperImpl implements Connecti
if (isClosed)
throw (SQLClientInfoException) TSDBError.createSQLException(TSDBErrorNumbers.ERROR_SQLCLIENT_EXCEPTION_ON_CONNECTION_CLOSED);
- if (clientInfoProps == null)
- clientInfoProps = new Properties();
- clientInfoProps.setProperty(name, value);
+ if (clientInfoProps != null)
+ clientInfoProps.setProperty(name, value);
}
@Override
diff --git a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/AbstractResultSet.java b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/AbstractResultSet.java
index abd348e68c..4b5b88d93b 100644
--- a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/AbstractResultSet.java
+++ b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/AbstractResultSet.java
@@ -10,6 +10,7 @@ import java.util.Map;
public abstract class AbstractResultSet extends WrapperImpl implements ResultSet {
private int fetchSize;
+ protected boolean wasNull;
protected void checkAvailability(int columnIndex, int bounds) throws SQLException {
if (isClosed())
@@ -28,7 +29,7 @@ public abstract class AbstractResultSet extends WrapperImpl implements ResultSet
@Override
public boolean wasNull() throws SQLException {
- return false;
+ return wasNull;
}
@Override
diff --git a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBConnection.java b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBConnection.java
index 5b4615485d..c8ab9fb15a 100644
--- a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBConnection.java
+++ b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBConnection.java
@@ -28,6 +28,7 @@ public class TSDBConnection extends AbstractConnection {
}
public TSDBConnection(Properties info, TSDBDatabaseMetaData meta) throws SQLException {
+ super(info);
this.databaseMetaData = meta;
connect(info.getProperty(TSDBDriver.PROPERTY_KEY_HOST),
Integer.parseInt(info.getProperty(TSDBDriver.PROPERTY_KEY_PORT, "0")),
diff --git a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBDriver.java b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBDriver.java
index 5f599df130..55533bd28c 100755
--- a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBDriver.java
+++ b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBDriver.java
@@ -95,11 +95,16 @@ public class TSDBDriver extends AbstractDriver {
*/
public static final String PROPERTY_KEY_BATCH_LOAD = "batchfetch";
+ /**
+ * timestamp format for JDBC-RESTful,should one of the options: string or timestamp or utc
+ */
+ public static final String PROPERTY_KEY_TIMESTAMP_FORMAT = "timestampFormat";
+
private TSDBDatabaseMetaData dbMetaData = null;
static {
try {
- java.sql.DriverManager.registerDriver(new TSDBDriver());
+ DriverManager.registerDriver(new TSDBDriver());
} catch (SQLException e) {
throw TSDBError.createRuntimeException(TSDBErrorNumbers.ERROR_CANNOT_REGISTER_JNI_DRIVER, e);
}
diff --git a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBPreparedStatement.java b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBPreparedStatement.java
index 728b537f71..56f971a35e 100644
--- a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBPreparedStatement.java
+++ b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBPreparedStatement.java
@@ -14,11 +14,12 @@
*****************************************************************************/
package com.taosdata.jdbc;
+import com.taosdata.jdbc.utils.Utils;
+
import java.io.InputStream;
import java.io.Reader;
import java.math.BigDecimal;
import java.net.URL;
-import java.nio.charset.Charset;
import java.sql.*;
import java.util.ArrayList;
import java.util.Calendar;
@@ -33,17 +34,9 @@ import java.util.regex.Pattern;
public class TSDBPreparedStatement extends TSDBStatement implements PreparedStatement {
private String rawSql;
- private String sql;
- // private ArrayList