change
This commit is contained in:
parent
4c37daff3d
commit
646acdb0f6
File diff suppressed because it is too large
Load Diff
|
@ -2,13 +2,15 @@ package com.taosdata.jdbc.rs;
|
|||
|
||||
import java.sql.ResultSetMetaData;
|
||||
import java.sql.SQLException;
|
||||
import java.util.List;
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class RestfulResultSetMetaData implements ResultSetMetaData {
|
||||
|
||||
private List<String> fields;
|
||||
private final String database;
|
||||
private ArrayList<RestfulResultSet.Field> fields;
|
||||
|
||||
public RestfulResultSetMetaData(List<String> fields) {
|
||||
public RestfulResultSetMetaData(String database, ArrayList<RestfulResultSet.Field> fields) {
|
||||
this.database = database;
|
||||
this.fields = fields;
|
||||
}
|
||||
|
||||
|
@ -24,6 +26,7 @@ public class RestfulResultSetMetaData implements ResultSetMetaData {
|
|||
|
||||
@Override
|
||||
public boolean isCaseSensitive(int column) throws SQLException {
|
||||
//TODO
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -39,7 +42,7 @@ public class RestfulResultSetMetaData implements ResultSetMetaData {
|
|||
|
||||
@Override
|
||||
public int isNullable(int column) throws SQLException {
|
||||
return 0;
|
||||
return ResultSetMetaData.columnNullable;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -54,7 +57,7 @@ public class RestfulResultSetMetaData implements ResultSetMetaData {
|
|||
|
||||
@Override
|
||||
public String getColumnLabel(int column) throws SQLException {
|
||||
return fields.get(column - 1);
|
||||
return fields.get(column - 1).name;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -64,7 +67,7 @@ public class RestfulResultSetMetaData implements ResultSetMetaData {
|
|||
|
||||
@Override
|
||||
public String getSchemaName(int column) throws SQLException {
|
||||
return null;
|
||||
return this.database;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -84,7 +87,7 @@ public class RestfulResultSetMetaData implements ResultSetMetaData {
|
|||
|
||||
@Override
|
||||
public String getCatalogName(int column) throws SQLException {
|
||||
return null;
|
||||
return this.database;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -8,6 +8,7 @@ import com.taosdata.jdbc.rs.util.HttpClientPoolUtil;
|
|||
import com.taosdata.jdbc.utils.SqlSyntaxValidator;
|
||||
|
||||
import java.sql.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
|
@ -27,6 +28,16 @@ public class RestfulStatement implements Statement {
|
|||
this.database = database;
|
||||
}
|
||||
|
||||
private String parseTableIdentifier(String sql) {
|
||||
List<String> words = Arrays.asList(sql.trim().toLowerCase().split(" "));
|
||||
if (words.get(0).equalsIgnoreCase("select")) {
|
||||
if (words.contains("from")) {
|
||||
return words.get(words.indexOf("from") + 1);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResultSet executeQuery(String sql) throws SQLException {
|
||||
if (isClosed())
|
||||
|
@ -35,39 +46,27 @@ public class RestfulStatement implements Statement {
|
|||
throw new SQLException("not a select sql for executeQuery: " + sql);
|
||||
|
||||
final String url = "http://" + conn.getHost() + ":" + conn.getPort() + "/rest/sql";
|
||||
// row data
|
||||
String result = HttpClientPoolUtil.execute(url, sql);
|
||||
String fields = "";
|
||||
List<String> words = Arrays.asList(sql.split(" "));
|
||||
if (words.get(0).equalsIgnoreCase("select")) {
|
||||
int index = 0;
|
||||
if (words.contains("from")) {
|
||||
index = words.indexOf("from");
|
||||
JSONObject resultJson = JSON.parseObject(result);
|
||||
if (resultJson.getString("status").equals("error")) {
|
||||
throw new SQLException(TSDBConstants.WrapErrMsg("SQL execution error: " + resultJson.getString("desc") + "\n" + "error code: " + resultJson.getString("code")));
|
||||
}
|
||||
|
||||
// parse table name from sql
|
||||
String tableIdentifier = parseTableIdentifier(sql);
|
||||
if (tableIdentifier != null) {
|
||||
// field meta
|
||||
String fields = HttpClientPoolUtil.execute(url, "DESCRIBE " + tableIdentifier);
|
||||
JSONObject fieldJson = JSON.parseObject(fields);
|
||||
if (fieldJson.getString("status").equals("error")) {
|
||||
throw new SQLException(TSDBConstants.WrapErrMsg("SQL execution error: " + fieldJson.getString("desc") + "\n" + "error code: " + fieldJson.getString("code")));
|
||||
}
|
||||
if (words.contains("FROM")) {
|
||||
index = words.indexOf("FROM");
|
||||
}
|
||||
fields = HttpClientPoolUtil.execute(url, "DESCRIBE " + words.get(index + 1));
|
||||
this.resultSet = new RestfulResultSet(database, this, resultJson, fieldJson);
|
||||
} else {
|
||||
this.resultSet = new RestfulResultSet(database, this, resultJson);
|
||||
}
|
||||
|
||||
JSONObject jsonObject = JSON.parseObject(result);
|
||||
if (jsonObject.getString("status").equals("error")) {
|
||||
throw new SQLException(TSDBConstants.WrapErrMsg("SQL execution error: " + jsonObject.getString("desc") + "\n" + "error code: " + jsonObject.getString("code")));
|
||||
}
|
||||
String dataStr = jsonObject.getString("data");
|
||||
if ("use".equalsIgnoreCase(fields.split(" ")[0])) {
|
||||
return new RestfulResultSet(dataStr, "");
|
||||
}
|
||||
|
||||
JSONObject jsonField = JSON.parseObject(fields);
|
||||
if (jsonField == null) {
|
||||
return new RestfulResultSet(dataStr, "");
|
||||
}
|
||||
if (jsonField.getString("status").equals("error")) {
|
||||
throw new SQLException(TSDBConstants.WrapErrMsg("SQL execution error: " + jsonField.getString("desc") + "\n" + "error code: " + jsonField.getString("code")));
|
||||
}
|
||||
String fieldData = jsonField.getString("data");
|
||||
|
||||
this.resultSet = new RestfulResultSet(dataStr, fieldData);
|
||||
this.affectedRows = 0;
|
||||
return resultSet;
|
||||
}
|
||||
|
@ -195,17 +194,19 @@ public class RestfulStatement implements Statement {
|
|||
|
||||
if (SqlSyntaxValidator.isSelectSql(sql)) {
|
||||
executeQuery(sql);
|
||||
} else if (SqlSyntaxValidator.isInsertSql(sql)) {
|
||||
executeUpdate(sql);
|
||||
} else {
|
||||
final String url = "http://" + conn.getHost() + ":" + conn.getPort() + "/rest/sql";
|
||||
HttpClientPoolUtil.execute(url, "use " + this.database);
|
||||
String result = HttpClientPoolUtil.execute(url, sql);
|
||||
JSONObject jsonObject = JSON.parseObject(result);
|
||||
if (jsonObject.getString("status").equals("error")) {
|
||||
throw new SQLException(TSDBConstants.WrapErrMsg("SQL execution error: " + jsonObject.getString("desc") + "\n" + "error code: " + jsonObject.getString("code")));
|
||||
} else if (SqlSyntaxValidator.isShowSql(sql) || SqlSyntaxValidator.isDescribeSql(sql)) {
|
||||
final String url = "http://" + conn.getHost().trim() + ":" + conn.getPort() + "/rest/sql";
|
||||
if (!SqlSyntaxValidator.isShowDatabaseSql(sql)) {
|
||||
HttpClientPoolUtil.execute(url, "use " + conn.getDatabase());
|
||||
}
|
||||
this.resultSet = new RestfulResultSet(jsonObject.getJSONArray("data"), jsonObject.getJSONArray("head"));
|
||||
String result = HttpClientPoolUtil.execute(url, sql);
|
||||
JSONObject resultJson = JSON.parseObject(result);
|
||||
if (resultJson.getString("status").equals("error")) {
|
||||
throw new SQLException(TSDBConstants.WrapErrMsg("SQL execution error: " + resultJson.getString("desc") + "\n" + "error code: " + resultJson.getString("code")));
|
||||
}
|
||||
this.resultSet = new RestfulResultSet(database, this, resultJson);
|
||||
} else {
|
||||
executeUpdate(sql);
|
||||
}
|
||||
|
||||
return true;
|
||||
|
|
|
@ -15,14 +15,12 @@
|
|||
package com.taosdata.jdbc.utils;
|
||||
|
||||
import com.taosdata.jdbc.TSDBConnection;
|
||||
import com.taosdata.jdbc.TSDBJNIConnector;
|
||||
|
||||
import java.sql.Connection;
|
||||
import java.sql.SQLException;
|
||||
|
||||
public class SqlSyntaxValidator {
|
||||
|
||||
private static final String[] updateSQL = {"insert", "update", "delete", "create", "alter", "drop", "show", "describe", "use"};
|
||||
private static final String[] updateSQL = {"insert", "update", "delete", "create", "alter", "drop", "show", "describe", "use", "import"};
|
||||
private static final String[] querySQL = {"select"};
|
||||
|
||||
private TSDBConnection tsdbConnection;
|
||||
|
@ -31,23 +29,6 @@ public class SqlSyntaxValidator {
|
|||
this.tsdbConnection = (TSDBConnection) connection;
|
||||
}
|
||||
|
||||
/*
|
||||
public boolean validateSqlSyntax(String sql) throws SQLException {
|
||||
boolean res = false;
|
||||
if (tsdbConnection == null || tsdbConnection.isClosed()) {
|
||||
throw new SQLException("invalid connection");
|
||||
} else {
|
||||
TSDBJNIConnector jniConnector = tsdbConnection.getConnection();
|
||||
if (jniConnector == null) {
|
||||
throw new SQLException("jniConnector is null");
|
||||
} else {
|
||||
res = jniConnector.validateCreateTableSql(sql);
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
*/
|
||||
|
||||
public static boolean isValidForExecuteUpdate(String sql) {
|
||||
for (String prefix : updateSQL) {
|
||||
if (sql.trim().toLowerCase().startsWith(prefix))
|
||||
|
@ -57,18 +38,28 @@ public class SqlSyntaxValidator {
|
|||
}
|
||||
|
||||
public static boolean isUseSql(String sql) {
|
||||
return sql.trim().toLowerCase().startsWith(updateSQL[8]) || sql.trim().toLowerCase().matches("create\\s*database.*") || sql.toLowerCase().toLowerCase().matches("drop\\s*database.*");
|
||||
return sql.trim().toLowerCase().startsWith("use") || sql.trim().toLowerCase().matches("create\\s*database.*") || sql.toLowerCase().toLowerCase().matches("drop\\s*database.*");
|
||||
}
|
||||
|
||||
public static boolean isUpdateSql(String sql) {
|
||||
return sql.trim().toLowerCase().startsWith(updateSQL[1]);
|
||||
public static boolean isShowSql(String sql) {
|
||||
return sql.trim().toLowerCase().startsWith("show");
|
||||
}
|
||||
|
||||
public static boolean isDescribeSql(String sql) {
|
||||
return sql.trim().toLowerCase().startsWith("describe");
|
||||
}
|
||||
|
||||
|
||||
public static boolean isInsertSql(String sql) {
|
||||
return sql.trim().toLowerCase().startsWith(updateSQL[0]);
|
||||
return sql.trim().toLowerCase().startsWith("insert") || sql.trim().toLowerCase().startsWith("import");
|
||||
}
|
||||
|
||||
public static boolean isSelectSql(String sql) {
|
||||
return sql.trim().toLowerCase().startsWith(querySQL[0]);
|
||||
return sql.trim().toLowerCase().startsWith("select");
|
||||
}
|
||||
|
||||
|
||||
public static boolean isShowDatabaseSql(String sql) {
|
||||
return sql.trim().toLowerCase().matches("show\\s*databases");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,9 @@
|
|||
package com.taosdata.jdbc.rs;
|
||||
|
||||
import org.junit.*;
|
||||
import org.junit.AfterClass;
|
||||
import org.junit.BeforeClass;
|
||||
import org.junit.FixMethodOrder;
|
||||
import org.junit.Test;
|
||||
import org.junit.runners.MethodSorters;
|
||||
|
||||
import java.sql.*;
|
||||
|
@ -26,6 +29,305 @@ public class SQLTest {
|
|||
@Test
|
||||
public void testCase003() {
|
||||
String sql = "show databases";
|
||||
executeWithResult(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase004() {
|
||||
String sql = "show tables";
|
||||
executeWithResult(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase005() {
|
||||
String sql = "show stables";
|
||||
executeWithResult(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase006() {
|
||||
String sql = "show dnodes";
|
||||
executeWithResult(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase007() {
|
||||
String sql = "show vgroups";
|
||||
executeWithResult(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase008() {
|
||||
String sql = "drop table if exists restful_test.weather";
|
||||
execute(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase009() {
|
||||
String sql = "create table if not exists restful_test.weather(ts timestamp, temperature float) tags(location nchar(64))";
|
||||
execute(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase010() {
|
||||
String sql = "create table t1 using restful_test.weather tags('北京')";
|
||||
execute(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase011() {
|
||||
String sql = "insert into restful_test.t1 values(now, 22.22)";
|
||||
executeUpdate(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase012() {
|
||||
String sql = "insert into restful_test.t1 values('2020-01-01 00:00:00.000', 22.22)";
|
||||
executeUpdate(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase013() {
|
||||
String sql = "insert into restful_test.t1 values('2020-01-01 00:01:00.000', 22.22),('2020-01-01 00:02:00.000', 22.22)";
|
||||
executeUpdate(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase014() {
|
||||
String sql = "insert into restful_test.t2 using weather tags('上海') values('2020-01-01 00:03:00.000', 22.22)";
|
||||
executeUpdate(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase015() {
|
||||
String sql = "insert into restful_test.t2 using weather tags('上海') values('2020-01-01 00:01:00.000', 22.22),('2020-01-01 00:02:00.000', 22.22)";
|
||||
executeUpdate(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase016() {
|
||||
String sql = "insert into t1 values('2020-01-01 01:0:00.000', 22.22),('2020-01-01 02:00:00.000', 22.22) t2 values('2020-01-01 01:0:00.000', 33.33),('2020-01-01 02:00:00.000', 33.33)";
|
||||
executeUpdate(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase017() {
|
||||
String sql = "Insert into t3 using weather tags('广东') values('2020-01-01 01:0:00.000', 22.22),('2020-01-01 02:00:00.000', 22.22) t4 using weather tags('天津') values('2020-01-01 01:0:00.000', 33.33),('2020-01-01 02:00:00.000', 33.33)";
|
||||
executeUpdate(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase018() {
|
||||
String sql = "select * from restful_test.t1";
|
||||
executeQuery(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase019() {
|
||||
String sql = "select * from restful_test.weather";
|
||||
executeQuery(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase020() {
|
||||
String sql = "select ts, temperature from restful_test.t1";
|
||||
executeQuery(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase021() {
|
||||
String sql = "select ts, temperature from restful_test.weather";
|
||||
executeQuery(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase022() {
|
||||
String sql = "select temperature, ts from restful_test.t1";
|
||||
executeQuery(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase023() {
|
||||
String sql = "select temperature, ts from restful_test.weather";
|
||||
executeQuery(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase024() {
|
||||
String sql = "import into restful_test.t5 using weather tags('石家庄') values('2020-01-01 00:01:00.000', 22.22)";
|
||||
executeUpdate(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase025() {
|
||||
String sql = "import into restful_test.t6 using weather tags('沈阳') values('2020-01-01 00:01:00.000', 22.22),('2020-01-01 00:02:00.000', 22.22)";
|
||||
executeUpdate(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase026() {
|
||||
String sql = "import into restful_test.t7 using weather tags('长沙') values('2020-01-01 00:01:00.000', 22.22) restful_test.t8 using weather tags('吉林') values('2020-01-01 00:01:00.000', 22.22)";
|
||||
executeUpdate(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase027() {
|
||||
String sql = "import into restful_test.t9 using weather tags('武汉') values('2020-01-01 00:01:00.000', 22.22) ,('2020-01-02 00:01:00.000', 22.22) restful_test.t10 using weather tags('哈尔滨') values('2020-01-01 00:01:00.000', 22.22),('2020-01-02 00:01:00.000', 22.22)";
|
||||
executeUpdate(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase028() {
|
||||
String sql = "select location, temperature, ts from restful_test.weather where temperature > 1";
|
||||
executeQuery(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase029() {
|
||||
String sql = "select location, temperature, ts from restful_test.weather where temperature < 1";
|
||||
executeQuery(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase30() {
|
||||
String sql = "select location, temperature, ts from restful_test.weather where ts > now";
|
||||
executeQuery(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase31() {
|
||||
String sql = "select location, temperature, ts from restful_test.weather where ts < now";
|
||||
executeQuery(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase32() {
|
||||
String sql = "select count(*) from restful_test.weather";
|
||||
executeQuery(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase33() {
|
||||
String sql = "select first(*) from restful_test.weather";
|
||||
executeQuery(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase34() {
|
||||
String sql = "select last(*) from restful_test.weather";
|
||||
executeQuery(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase35() {
|
||||
String sql = "select last_row(*) from restful_test.weather";
|
||||
executeQuery(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase36() {
|
||||
String sql = "select ts, ts as primary_key from restful_test.weather";
|
||||
executeQuery(sql);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void testCase037() {
|
||||
String sql = "select database()";
|
||||
execute("use restful_test");
|
||||
executeQuery(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase038() {
|
||||
String sql = "select client_version()";
|
||||
executeQuery(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase039() {
|
||||
String sql = "select server_status()";
|
||||
executeQuery(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase040() {
|
||||
String sql = "select server_status() as status";
|
||||
executeQuery(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase041() {
|
||||
String sql = "select tbname, location from restful_test.weather";
|
||||
executeQuery(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase042() {
|
||||
String sql = "select count(tbname) from restful_test.weather";
|
||||
executeQuery(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase043() {
|
||||
String sql = "select * from restful_test.weather where ts < now - 1h";
|
||||
executeQuery(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase044() {
|
||||
String sql = "select * from restful_test.weather where ts < now - 1h and location like '%'";
|
||||
executeQuery(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase045() {
|
||||
String sql = "select * from restful_test.weather where ts < now - 1h order by ts";
|
||||
executeQuery(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase046() {
|
||||
String sql = "select last(*) from restful_test.weather where ts < now - 1h group by tbname order by tbname";
|
||||
executeQuery(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase047() {
|
||||
String sql = "select * from restful_test.weather limit 2";
|
||||
executeQuery(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase048() {
|
||||
String sql = "select * from restful_test.weather limit 2 offset 5";
|
||||
executeQuery(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase049() {
|
||||
String sql = "select * from restful_test.t1, restful_test.t3 where t1.ts = t3.ts ";
|
||||
executeQuery(sql);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase050() {
|
||||
String sql = "select * from restful_test.t1, restful_test.t3 where t1.ts = t3.ts and t1.location = t3.location";
|
||||
executeQuery(sql);
|
||||
}
|
||||
|
||||
private void executeUpdate(String sql) {
|
||||
try (Statement statement = connection.createStatement()) {
|
||||
long start = System.currentTimeMillis();
|
||||
int affectedRows = statement.executeUpdate(sql);
|
||||
long end = System.currentTimeMillis();
|
||||
System.out.println("[ affected rows : " + affectedRows + " ] time cost: " + (end - start) + " ms, execute statement ====> " + sql);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private void executeWithResult(String sql) {
|
||||
try (Statement statement = connection.createStatement()) {
|
||||
statement.execute(sql);
|
||||
ResultSet resultSet = statement.getResultSet();
|
||||
|
@ -35,13 +337,6 @@ public class SQLTest {
|
|||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCase004() {
|
||||
String sql = "select * from restful_test.weather";
|
||||
executeQuery(sql);
|
||||
}
|
||||
|
||||
|
||||
private void execute(String sql) {
|
||||
try (Statement statement = connection.createStatement()) {
|
||||
long start = System.currentTimeMillis();
|
||||
|
|
Loading…
Reference in New Issue