diff --git a/.gitignore b/.gitignore
index 153a71bb7d24ab667f81e79888a6aad1a3bfd61e..1cb4767e7c9447d1fcbc69307da2a632425ec293 100644
--- a/.gitignore
+++ b/.gitignore
@@ -23,3 +23,5 @@ tests/script/
tests/pytest/
tests/jenkins/
tests/hdfs/
+
+*.iml
diff --git a/src/connector/jdbc/pom.xml b/src/connector/jdbc/pom.xml
index 0fdc73080a508fa692746a38808fe017bf085573..8840fd7e823fd21f212739a38ed5cccdc4bb2914 100755
--- a/src/connector/jdbc/pom.xml
+++ b/src/connector/jdbc/pom.xml
@@ -1,15 +1,77 @@
4.0.0
+
com.taosdata.jdbc
taos-jdbcdriver
- 1.0.1
+ 1.0.2
+ jar
+
JDBCDriver
+ https://github.com/taosdata/TDengine/tree/master/src/connector/jdbc
TDengine JDBC Driver
-
- UTF-8
-
-
+
+
+
+ GNU AFFERO GENERAL PUBLIC LICENSE Version 3
+ https://github.com/taosdata/TDengine/blob/master/LICENSE
+ repo
+
+
+
+
+ scm:git:git://github.com/taosdata/TDengine.git
+ scm:git:git@github.com:taosdata/TDengine.git
+ https://github.com/taosdata/TDengine/tree/master/src/connector/jdbc
+ HEAD
+
+
+
+
+ taosdata
+ support@taosdata.com
+ https://www.taosdata.com/
+ https://www.taosdata.com/
+
+
+
+
+ UTF-8
+ 1.8
+
+ 3.0.1
+ 3.6.0
+ 1.6
+ 3.1.0
+ 2.19.1
+ 2.8.2
+ 1.6.7
+ 2.5.3
+ 1.9.5
+
+ 1.1.2
+ 3.5
+
+
+
+
+ commons-logging
+ commons-logging
+ ${commons-logging.version}
+
+
+ *
+ *
+
+
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+
@@ -18,7 +80,7 @@
3.0.0
-
+
src/main/assembly/assembly-jar.xml
@@ -35,18 +97,19 @@
org.apache.maven.plugins
maven-compiler-plugin
- 2.3.2
+ ${maven-compiler-plugin.version}
UTF-8
- 1.8
- 1.8
+ ${java.version}
+ ${java.version}
true
+ true
org.apache.maven.plugins
maven-source-plugin
- 2.1.2
+ ${maven-source-plugin.version}
attach-sources
@@ -56,24 +119,101 @@
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+ ${maven-javadoc-plugin.version}
+
+ UTF-8
+ UTF-8
+ UTF-8
+
+
+
+ attach-javadocs
+
+ jar
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-gpg-plugin
+ ${maven-gpg-plugin.version}
+
+
+ sign-artifacts
+ verify
+
+ sign
+
+
+
+
+
+ maven-deploy-plugin
+ ${maven-deploy-plugin.version}
+
+
+ default-deploy
+ deploy
+
+ deploy
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ ${maven-surefire-plugin.version}
+
+ true
+
+
+
+ org.sonatype.plugins
+ nexus-staging-maven-plugin
+ ${nexus-staging-maven-plugin.version}
+ true
+
+ ossrh-td
+ https://oss.sonatype.org/
+ true
+
+
+
+ org.apache.maven.plugins
+ maven-release-plugin
+ ${maven-release-plugin.version}
+
+ true
+ false
+ forked-path
+ -Dgpg.passphrase=${gpg.passphrase}
+
+
+
+ org.apache.maven.scm
+ maven-scm-provider-gitexe
+ ${maven-scm-provider-gitexe.version}
+
+
+
+
-
-
- commons-logging
- commons-logging
- 1.1.2
-
-
- *
- *
-
-
-
-
- org.apache.commons
- commons-lang3
- 3.5
-
-
+
+
+
+ ossrh-td
+ https://oss.sonatype.org/content/repositories/snapshots
+
+
+ ossrh-td
+ https://oss.sonatype.org/service/local/staging/deploy/maven2/
+
+
+
diff --git a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/SavedPreparedStatement.java b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/SavedPreparedStatement.java
new file mode 100644
index 0000000000000000000000000000000000000000..5e4aacb8601a6a0cc3e82d3c2ac7640248c047ef
--- /dev/null
+++ b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/SavedPreparedStatement.java
@@ -0,0 +1,423 @@
+package com.taosdata.jdbc;
+
+import com.taosdata.jdbc.bean.TSDBPreparedParam;
+
+import java.sql.SQLException;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * this class is used to precompile the sql of tdengine insert or import ops
+ */
+public class SavedPreparedStatement {
+
+ private TSDBPreparedStatement tsdbPreparedStatement;
+
+ /**
+ * sql param List
+ */
+ private List sqlParamList;
+
+ /**
+ * init param according the sql
+ */
+ private TSDBPreparedParam initPreparedParam;
+
+ /**
+ * is table name dynamic in the prepared sql
+ */
+ private boolean isTableNameDynamic;
+
+ /**
+ * insert or import sql template pattern, the template are the following:
+ *
+ * insert/import into tableName [(field1, field2, ...)] [using stables tags(?, ?, ...) ] values(?, ?, ...) (?, ?, ...)
+ *
+ * we split it to three part:
+ * 1. prefix, insert/import
+ * 2. middle, tableName [(field1, field2, ...)] [using stables tags(?, ?, ...) ]
+ * 3. valueList, the content after values, for example (?, ?, ...) (?, ?, ...)
+ */
+ private Pattern sqlPattern = Pattern.compile("(?s)(?i)^\\s*(INSERT|IMPORT)\\s+INTO\\s+((?\\S+)\\s*(\\(.*\\))?\\s+(USING\\s+(?\\S+)\\s+TAGS\\s*\\((?.+)\\))?)\\s*VALUES\\s*(?\\(.*\\)).*");
+
+ /**
+ * the raw sql template
+ */
+ private String sql;
+
+ /**
+ * the prefix part of sql
+ */
+ private String prefix;
+
+ /**
+ * the middle part of sql
+ */
+ private String middle;
+
+ private int middleParamSize;
+
+ /**
+ * the valueList part of sql
+ */
+ private String valueList;
+
+ private int valueListSize;
+
+ /**
+ * default param value
+ */
+ private static final String DEFAULT_VALUE= "NULL";
+
+ private static final String PLACEHOLDER= "?";
+
+ private String tableName;
+
+ /**
+ * is the parameter add to batch list
+ */
+ private boolean isAddBatch;
+
+ public SavedPreparedStatement(String sql, TSDBPreparedStatement tsdbPreparedStatement)throws SQLException {
+ this.sql = sql;
+ this.tsdbPreparedStatement = tsdbPreparedStatement;
+ this.sqlParamList = new ArrayList<>();
+
+ parsePreparedParam(this.sql);
+ }
+
+ /**
+ * parse the init param according the sql param
+ * @param sql
+ */
+ private void parsePreparedParam(String sql)throws SQLException{
+
+ Matcher matcher = sqlPattern.matcher(sql);
+
+ if(matcher.find()){
+
+ tableName = matcher.group("tablename");
+
+ if (tableName != null && PLACEHOLDER.equals(tableName)){
+ // the table name is dynamic
+ this.isTableNameDynamic = true;
+ }
+
+ prefix = matcher.group(1);
+ middle = matcher.group(2);
+ valueList = matcher.group("valueList");
+
+ if(middle != null && !"".equals(middle)){
+ middleParamSize = parsePlaceholder(middle);
+ }
+
+ if(valueList != null && !"".equals(valueList)){
+ valueListSize = parsePlaceholder(valueList);
+ }
+
+ initPreparedParam = initDefaultParam(tableName, middleParamSize, valueListSize);
+
+ }else{
+ // not match
+ throw new SQLException(TSDBConstants.WrapErrMsg("the sql is not complete!"));
+ }
+
+ }
+
+ private TSDBPreparedParam initDefaultParam(String tableName, int middleParamSize, int valueListSize){
+
+ TSDBPreparedParam tsdbPreparedParam = new TSDBPreparedParam(tableName);
+
+ tsdbPreparedParam.setMiddleParamList(getDefaultParamList(middleParamSize));
+
+ tsdbPreparedParam.setValueList(getDefaultParamList(valueListSize));
+
+ return tsdbPreparedParam;
+ }
+
+ /**
+ * generate the default param value list
+ * @param paramSize
+ * @return
+ */
+ private List